zoukankan      html  css  js  c++  java
  • 理解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
  • 相关阅读:
    下载文件
    文件上传后台
    触发器
    存储过程
    火狐浏览器不能获取 event,解决js报错问题
    Oracle 数据库--一个用户同步的sql
    基于二进制的权限控制
    自定义jsp标签
    http,socket和websocket
    正向代理和反向代理
  • 原文地址:https://www.cnblogs.com/goloving/p/7087631.html
Copyright © 2011-2022 走看看