JavaScript模仿块级作用域

对于其他语言,{ }内定义变量中括号内代码执行完毕后被销毁。而对JavaScript来说,并不会这样,因为JavaScript没有块级作用域。例如

if (true) { 
 var color = "blue"; 
} 
alert(color); //"blue"

这个例子中,if语句{ }内定义的color变量中if语句执行完之后仍然可以中全局环境中调用。这是因为if语句的并没有产生块级作用域。也就是说,块语句中定义的变量实际上上包含中函数或者全局环境中,而不是块语句中。这一点与其他语言不同,需要留意。

例如:

function outputNumbers(count){ 
 for (var i=0; i < count; i++){ 
 alert(i); 
 } 
 alert(i); //  输出0
}

这里for语句中定义了i=0,由于没有块级作用域,i存在于ouputNumbers()的活动对象中,函数内部随处可以访问到i,因此最后alert(i)是 0.

为了使得js具有块级作用域,可以使用匿名函数模仿块级作用域。形式如下:

(function(){ 
 //这里是块级作用域
})();

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

无论在什么地方,只要临时需要一些变量,就可以使用私有作用域,例如:

function outputNumbers(count){ 
 (function () { 
 for (var i=0; i < count; i++){ 
 alert(i); 
 } 
 })(); 
 alert(i); //导致一个错误!
}

这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。

一般来说,我们都应该尽量少向全局作用域中添加变量和函数。在一个由很多开发人员共同参与的大型 应用程序中,过多的全局变量和函数很容易导致命名冲突。而通过创建私有作用域,每个开发人员既可 以使用自己的变量,又不必担心搞乱全局作用域。


版权声明:本文为guitarist0505原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。