JS 模仿块级作用域

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 !');

  }

})();

上一篇:bzoj1029 [JSOI2007]建筑抢修


下一篇:关于 tlb 文件