码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2016-08-22 17:47:19      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

  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,是因为这个匿名函数是一个闭包,它能够访问作用域中的所有变量。

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

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

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

标签:

原文地址:http://www.cnblogs.com/PrajnaParamita/p/5796241.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!