转自JavaScript高级程序设计i(第三版):
javascript没有块级作用域的概念,只有两个环境,函数环境和全局环境。
function test(){
for(var i=0;i<10;i++){
}
alert(i);//10
}
function test(){
for(var i=0;i<10;i++){
}
var i;//重新声明变量
alert(i);//10
}
Javascript从来不会告诉你是否多次声明了一个变量;遇到这种情况,它只会对后续的声明视而不见。
但是,如果在后续声明中对变量进行了初始化,也是会执行的。
function test(){
for(var i=0;i<10;i++){
}
var i=0;//重新声明变量
alert(i);//0
}
用作块级作用域(通常称为私有作用域)的匿名函数的语法如下所示:
(function(){
//这里是块级作用域;
})();
但是,注意,以下代码会导致错误:
function(){
//这里是块级作用域;
}();//出错!!!
因为Javascript将function关键字当作一个函数声明的开始,而函数声明的后面不能跟圆括号。
但是,函数表达式的后面可以跟圆括号。要将函数声明转换为函数表达式,只需要像下文一样给它加上一对圆括号。
(function(){
//这里是块级作用域;
})();
无论什么地方,只要临时需要一些变量,就可以使用私有作用域。function test(){
(function(){
for(var i=0;i<10;i++){
}
})();
alert(i);//导致一个错误!!!
}
在匿名函数中定义的任何变量,都会在执行结束的时候被销毁。
这种做法可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。只要函数执行完毕,就可以立即销毁其作用域了。