JS函数表达式 -- 模仿块级作用域

  JavaScript没有块级作用域的概念。这意味着在语句中定义的变量,实际上是在包含函数中而非语句中创建的。

1 function outputNumbers(count){
2     for(var i=0; i<count; i++){
3         alert("In: " + i);
4     }
5     var i;
6     alert("Out: " + i);
7 }
8 outputNumbers(2);    //In: 0  In: 1  Out:2

在这个函数中定义了一个for循环。而变量i的初始值被设置为0。在其他语言中。变量i定义在for循环的语句块中。循环一旦结束,i 就会被销毁。

可是在JavaScript中。变量 i 属于outputNumbers()。在该函数内部都可以访问。即使重新声明同一个变量,也不会改变他的值。

当多次声明了同一个变量时,JavaScript不会有提示。它只会对后续的声明视而不见,不过他会执行后续声明中的变量初始化(第五行改成 var i = 6; 输出Out: 6 )。

匿名函数函数可以用来模仿块级作用域 并避免这个问题。

  块级作用域(通常称为私有作用域)的匿名函数语法如下:

(function(){
    //这里是块级作用域
})();

以上代码定义 并立即调用了一个匿名函数。将函数声明包含在一对圆括号中。表示它实际上是一个函数表达式。

紧随其后的另一对圆括号会立即调用这个函数。

无论在什么地方,只要临时须要一些变量,就可以使用私有作用域。

 1 function outputNumbers(count){
 2     (function(){
 3         for(var i=0; i<count; i++){
 4             alert("In: " + i);
 5         }
 6     })();
 7     var i;
 8     alert("Out: " + i);
 9 }
10 outputNumbers(2);    //In: 0  In: 1  Out: undefined

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

私有作用域中能够访问变量count,是因为这个匿名函数是一个闭包,它能够访问作用域中的所有变量。

一般来说,我们都应尽量减少向全局作用域中添加变量和函数。这种技术经常在全局作用域中备用在函数外部。从而限制向全局作用域中添加过多的变量和函数。

这种方法可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。只要函数执行完毕,就可以立即销毁其作用域链了。

posted @ 2016-08-22 16:58  chenccc  阅读(402)  评论(0编辑  收藏  举报