js中没有块级作用域的概念,例如:
function printNumber(num)
{
for(var i = 0; i < num; i ++ )
{
console.log(i);
}
alert(i);
}
在java、c++等语言中,变量只会在for循环内有定义,在for循环外是访问不到的,但上面这段代码却可以在js中正确的执行。
或许也可以在下面重新声明同一个变量,遇到这种情况,它只会对后续声明视而不见。
function printNumber(num)
{
for(var i = 0; i < num; i ++ )
{
console.log(i);
}
var i;
alert(i);
}
匿名函与数可以模仿块级作用域并避免js没有块级作用域而导致的问题。
用块级作用域(通常称为私有作用域)的匿名函数的语法如下:
(function(){
//这里是块级作用域
})();
以上代 码定义并立即调用了一个匿名函数,将函数声明包含在一对圆括号中,它实际上是一个函数表达式。而紧随其后的另一对圆括号会立即调用这个函数。
如果这样定义
function(){
//这里是块级作用域
}();//出错
因为js将function关键字作为一个函数声明的开始,而函数声明后不应该圆括号,要将函数函数声明转换成函数表达式只需给它外部加上圆括号即可;
(function(){
//这里是块级作用域
})();
无论在什么地方,只要临时需要一些变量就可以使用上面的私有作用域。
function printNumber(num)
{
(function(){
for(var i = 0; i < num; i ++ )
{
console.log(i);
}
})();
alert(i); //会导致错误
}
此时变量i只能在循环中使用,使用后即被销毁。而num可以在私有作用域中被访问,是因为匿名函数是一个闭包,它能够访问包含作用域中的所有变量。
一般来说,都应该尽量减少向全局作用域中添加变量和函数,因为在项目开发中,一般过多的全局变量容易引起命名冲突。在js中使用这种方法创建私有作用域每个开发人员即可以使用自己的变量,又不会担心搞乱全局变量。