对于其他语言,{ }内定义变量中括号内代码执行完毕后被销毁。而对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); //导致一个错误!
}
这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。
一般来说,我们都应该尽量少向全局作用域中添加变量和函数。在一个由很多开发人员共同参与的大型 应用程序中,过多的全局变量和函数很容易导致命名冲突。而通过创建私有作用域,每个开发人员既可 以使用自己的变量,又不必担心搞乱全局作用域。