理解JavaScript模仿块作用域

1、JS没有块作用域

  在C和Java中,一对大括号{}决定一个作用域,比如for循环。在js中,变量可以在函数任何一处定义,并且忽略重复定义。变量初始化之前使用,值永远是undefined。

function count(){  
    b=1;  
    a=1;  
    alert(a);//1  
    for(var a=0;a<7;a++){ // to do something  }  
    var a;  
    alert(a);  //7
}  
count();  
alert(b);//1  
alert(a);//a is not defined  

  count函数中没有定义b,所以在执行b=1时,在全局中添加了变量b;count种定义了a,注意是在for中定义的,a的作用域是count,在全局alert会报错;在for循环后面的var a是被解释器忽略的语句,因为它属于重复定义;重复定义并没有把a清空,后面的alert还是有效的。

2、模仿块级作用域

(1)块级作用域的特点:

    1、内部定义的变量在外部不可用;

    2、可使用外部变量;

    3、立即执行不属于调用;

    4、如果没定义内部变量,去掉块和加上块完全没区别。

(2)根据以上特点,使用“函数强制执行”来模拟块级作用域。根据块级作用域的特点,不需要使用声明函数,也不需要块执行后返回一个特定结果。

(3)匿名函数提供了一个子作用域,满足了块级作用域特点一;

    匿名函数作为子函数,利用作用域链满足了特点二;

    强制执行满足了特点三;

    前三点联合起来满足了特点四。

(4)使用强制执行的匿名函数模仿块级作用域,还有一个好处是在生成闭包时,能保护父级临时变量,因为强制执行是可以传递形参的。

(5)匿名函数毕竟也是函数,因此必要时可以保存它的执行返回值。所以说,这种方式其实比块级作用域强大得多,使用起来也灵活得多。

var a=1;  
(function(){  
    var i=1;  //i私有变量
    for(var n=0;n<10;n++){
        i++;
    }  
    alert(i); //11
    alert(a);//1
})();  //函数自执行
(function(p){  
    alert(p+2); //3
})(a);  
var d=(function(p){  //d全局
    return p+1;  
})(a);  
alert(d);//2
alert(i);//not defined

原文链接:https://www.cnblogs.com/goloving/p/7087631.html
本文来源 爱码网,其版权均为 原网址 所有 与本站无关,文章内容系作者个人观点,不代表 本站 对观点赞同或支持。如需转载,请注明文章来源。

© 版权声明

相关文章