模仿块级作用域
JavaScript中没有块级作用域,这意为着在块语句中定义的变量,实际上是包含在函数中而非语句中创建的。
下面的这个实例可以看出:
function outputNumbers(count){
for (var i=0; i < count; i++){
alert(i);
}
alert(i); //count
}
outputNumbers(5);//0 1 2 3 4 5(for块语句外输出的)
虽然没有块级作用域,但是可以通过匿名函数来模仿块级作用域
用作块级作用域(通常称为私有作用域)的匿名函数语法如下表示:
(function(){
//这里是块级作用域
})();
以上代码定义并立即调用了一个匿名函数。将函数申明包含在一对圆括号中,表示它实际上是一个函数表达式。
注意,下面这种写法会出错
//错误写法
function(){
//这里是块级作用域
}();
如果一条语句是以function关键字开始,那么这段会被JavaScript解析器认为是函数定义。而函数定义是不能被立即执行的,因此就必须有一个办法,使解析器可以将之识别为函数表达式。因为解析器识别函数定义的条件是以function关键字开始,那么只要在function关键字的前面有任何其他的元素,就会从函数定义转变为函数表达式,所以当我们在其前面填括号就会变成函数表达式了。
下面这种写法也可以:
(function(){
//这里是块级作用域
}());
现在让我们重新写开头的那个实例:
function outputNumbers(count){
(function () {
for (var i=0; i < count; i++){
alert(i);
}
})();
alert(i); //ReferenceError: i is not defined,出现错误了
outputNumbers(5);//0 1 2 3 4
总结:无论在什么地方,只要临时需要使用变量,就可以使用私有作用域,通过创建私有作用域,每个人都可以使用自己的变量,又不用担心污染全局作用域。