引文:

JavaScript 没有块级作用域的概念。这意味着在块语句中定义的变量,实际上是在包含
函数中而非语句中创建的(也就是在函数外边也可以访问的到),来看下面的例子:

  1. function outputNumbers(count){
  2. for (var i=0; i < count; i++){
  3. alert(i);
  4. }
  5. alert(i); //计数
  6. }

匿名函数来模仿块级作用域:

但是,JavaScript 从来不会告诉你是否多次声明了同一个变量;遇到这种情况,它只会对后续的声明视而不
见(不过,它会执行后续声明中的变量初始化)。匿名函数可以用来模仿块级作用域并避免这个问题。
也就是模仿块级作用域,可以看作一个私有作用域,当然之前的例子会出现一个错误,如下所示:

  1. function outputNumbers(count){
  2. (function () {
  3. for (var i=0; i < count; i++){
  4. alert(i);
  5. }
  6. })();
  7. alert(i); //导致一个错误!
  8. }