在java、C++等语言中,for循环中的i变量只会在for循环的语句块中有定义,循环一旦结束,变量i就会被销毁。可是在js中,变量i是定义在outputNumbers()的活动对象中,因此一旦从它有定义开始,就可以在函数内部随处访问它。即使像下面这样错误地重新声明同一变量,也不会改变它的值。

   function outputNumbers(count){

       for(var i=0;i<count;i++){

           alert(i);

       }

       var i;

       alert(i);

   }

   无论在任何地方只要临时需要一些变量,就可以使用私有作用域,例如:

   function outputNumbers(count){

       (function (){

           for(var i;i<10;i++){

           alert(i);

           }

         })();

       alert(i);//导致一个错误

       }

在重写后的outputNummbers()函数中,我们在for循环外部插入了一个私有作用域。在匿名函数中定义的任何变量,都会在执行结束时被销毁。因此,变量i只能在循环中使用,使用后即被销毁。

   这种技术经常在全局作用域中被调用在函数外部,从而限制向全局作用域中添加过多的变量和函数。一般来说,我们都应该尽量少向全局作用域添加变量和函数。在一个由很多开发人员共同参与的大型应用程序中,过多的使用全局变量和函数会导致命名冲突。而通过创建私用作用域,每个开发人员既可以使用的变量,又不必担心搞乱全局作用域。