模仿块级作用域
如前所述,JavaScript 没有块级作用域的概念。这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的,来看下面的例子。
javascript
function outputNumbers(count) {
for (var i = 0; i < count; i++) {
alert(i);
}
alert(i); //计数
}
在 Java、C++等语言中,变量 i只会在 for 循环的语句块中有定义,循环一旦结束,变量 i 就会被销毁。可是在 JavaScrip 中,变量 i是定义在 ouputNumbers() 的活动对象中的,因此从它有定义开始,就可以在函数内部随处访问它。
用作块级作用域(通常称为私有作用域)的匿名函数的语法如下所示。
javascript
(function () {
//这里是块级作用域
})();
然而,下面的代码却会导致错误。
javascript
function(){
//这里是块级作用域
}(); //出错!
这段代码会导致语法错误,是因为 JavaScript 将 function 关键字当作一个函数声明的开始,而函数声明后面不能跟圆括号。然而,函数表达式的后面可以跟圆括号。
我们都应该尽量少向全局作用域中添加变量和函数。在一个由很多开发人员共同参与的大型应用程序中,过多的全局变量和函数很容易导致命名冲突。