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 中使用块级作用域还有一个好处,当匿名函数执行完毕后,其作用域链立即销毁,从而可以减少闭包占用资源问题。