JS模仿块级作用域
学习总结2o( ̄ヘ ̄o#)
JavaScript是没用块级作用域的,这意味的在块语言中定义的变量,实际上是包含在函数中定义而非语句中定义的。
function test(){
for(var i = 0; i < 10; i++){
console.log(i);
}
console.log(i); <!--这里并不会输出not defined,而是输出10-->
}
在Java和C++等语言中,变量i只会在for循环的语句块中有定义,而循环一结束,变量i就会被销毁。但是,在JavaScript中,变量i是定义在test()的活动对象中的。所以,只要从它有定义了开始,就可以在test函数内部随处可以访问到变量i。
function test(){
for(var i = 0; i < 10; i++){
console.log(i);
}
var i; <!--重新声明-->
console.log(i); <!--值不会发生任何改变,依旧输出10-->
}
即使像上面重新声明变量i,也不会改变值。但是,我们可以用匿名函数来模仿块级作用域来避免这个问题。
匿名函数模仿块级作用域
匿名函数模仿的语法:
(function(){
<!--块级作用域-->
})();
上面代码的意思是定义并立即调用一个匿名函数。第一个圆括号(function(){})是将函数声明转换的函数表达式。第二个圆括号则会立即调用这个函数。
为什么要将函数声明转换成函数表达式呢,不能这样写吗
function(){
<!--块级作用域-->
}();
这样会导致语法出错,因为:
JavaScript将function关键字当做一个函数声明的开始,而函数声明后面不能跟圆括号。然而,函数表达式的后面可以跟圆括号。
而将函数声明转换成函数表达式,只要加上一对圆括号就可以了。
(function(){
<!--块级作用域-->
})();
现在可以再来尝试一下
function test(){
(function(){
for(var i = 0; i < 10; i++){
console.log(i);
}
})();
console.log(i); <!--输出undefined-->
}
不难发现,已经成功了。通过这样创建私有作用域,我们可以在团队开发中减少往全局变量里添加过多的变量和函数从而导致的命名冲突,因为所有在匿名函数中定义的任何变量,都会在执行结束时被销毁。
如果有什么地方出错了,希望能及时告知,谢谢。