function outputNumbers(count) {
for (var i=0; i<count; i++) {
console.log(i);
}
var i; // 重新声明变量
console.log(i); // 计数
}
上述中,重复声明了i变量,但是JS从来不会告诉你是否多次声明了同一变量;遇到这种情况,它只会对后续的声明视而不见
不过,它会执行后续声明中变量的初始化。匿名变量可以用来模仿块级作用域并避免这个问题。
(function() {
// 这里是块级作用域(私有作用域)
}) ();
以上代码定义并立即调用了一个匿名函数。将函数声明包含在一对圆括号中,表明它是一个函数表达式。
function () {
//这里是块级作用域
}(); // 出错
上述会出错,因为JS将function关键字当作一个函数声明的开始,而函数声明后面不能跟圆括号。要将函数声明转化为函数表达式,只需要加一对圆括号
无论在什么地方,只要临时需要一些变量,就可以使用私有作用域。
function outputNumbers (count) {
(function () {
for (var i=0; i<count; i++) {
alert(i);
}
})(); // 是闭包,使用块级作用域同时减少了闭包占用内存的问题,因为没有指向匿名函数的引用,所以一旦执行完成就会被销毁
alert(i); // 出错
}
我们在for循环外部插入了一个私有作用域,在匿名函数中定义的任何变量,都会在执行结束时被销毁。
因此,变量i只能在循环中使用,使用后即被销毁。
而在私有作用域中可以访问count,是因为这个匿名函数是一个闭包,它能够访问包含作用域中所有变量。
这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。
一般来说,我们都应该尽量少向全局作用域中添加变量和函数。
过多的全局变量和函数容易造成命名冲突
(function () {
var now = new Date();
if (now.getMonth() == 0 && now.getDate() == 1) {
alert('Happy New Year !');
}
})();