javascript 块级作用域

参考:https://www.cnblogs.com/fengmiaosen/archive/2011/01/10/1932403.html

首先,在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)。而在javascript中则没有块级作用域,例如:

<script>
  for(var i=0;i<10;i++){

  }
  alert(i);  // 全局的i值为10了
</script>

结果是:
在这里插入图片描述

很显然,这并不是我们预期的效果,但为什么会这样呢?

这是因为:javascript中,for语句中定义的变量i在循环结束后,依旧会存在于循环外部的执行环境(作用域)中,在这里i的作用域是全局环境。具体来说就是:使用var关键字声明变量时,这个变量会自动添加到 距离最近的可用环境中。对于函数而言,这个最近的环境就是函数的局部环境。如果变量在未经声明的情况下被初始化,则该变量会被自动添加到全局环境。

怎么样解决呢?

可以使用函数模拟块级作用域:

<script>
  (function(){
    //块级作用域
    for(var i=0;i<10;i++){

    }
    alert(i);
  })();

  console.log(i)
</script>

首先,正常输出块级作用的10,然后全局打印会报错i不存在。这说明,我们很好的实现了块级作用域

语法:

(function(){

    //块级作用域

})();

解析:

以上代码的意思是:首先定义并立即调用一个匿名函数。将函数声明包含在圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号表示立即调用这个函数。

例如:

var myFunc=function(){
    alert(‘函数’);
};
myFunc();

上面的代码中,首先以函数表达式的方式定义了一个函数,然后立即调用它。在这里定义函数的方式就是先创建一个匿名函数,然后将其赋值给变量myFunc,而在函数名称后加一对圆括号即表示调用函数。那我们如果直接用匿名函数代表变量myFunc,在匿名函数后面添加一对圆括号不就表示直接调用了吗?然而,如果如下这样做就会报错:

function(){
    //块级作用域  写法报错……
}();

因为在javascript中,function关键字表示一个函数声明的开始,而函数声明后面不能直接跟圆括号。而函数表达式后面可以跟圆括号,来表示函数调用。在函数声明外面加一对圆括号就可以转换成函数表达式,如下:

(function(){

    //块级作用域

})();

这样最简单的块级作用域就创建好了。这种技术长在全局作用域中用在函数外部,来限制向全局作用域中添加过多的变量和函数。

注意:javascript 中使用块级作用域还有一个好处,当匿名函数执行完毕后,其作用域链立即销毁,从而可以减少闭包占用资源问题。

posted @ 2022-12-06 22:18  轻风细雨_林木木  阅读(10)  评论(0编辑  收藏  举报