• JS 作用域 p1


    引用《你不知道的JavaScript》中的话,如下;

      负责收集并维护由所有生命的标识符(变量)组成的一系列查询并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。

      那么作用域实际上我理解的就是一种能力或者说在一定范围区域,他有父子之分,有嵌套之别。

      

      概念性的内容不多说,主要是自己理解和在实际编程中使用。

      在js执行时需要几个步骤、比如var a=2;

      1.编译器会让作用域查询下是否存在变量a,如果有编译器将忽略、如果没有就创建一个变量命名为a

      2.编译器为引擎生成运行时的代码,处理a=2的赋值操作,然后引擎为问作用域是否有a,没有的话继续向上寻找。

      如果最终找到了a,就赋值。赋值就丢出一个ReferenceError: a is not defined

      另一个要说的是LHS 查询和RHS 查询,

      记住LHS 是 查询容器本身(或者说声明本身 比如 var a)

      RHS 为赋值查询 (a=2)

      L 与 R 是一种语义上的区别,并不一定非要在左边和右边,例如:

      

    function fn(a){}; // LHS 
    
    fn(2);// RHS

      再说一个大家都知道的概念,关于作用域嵌套,还是 a=2;

    var a = 2;
    
    function fn(){
        console.log(a);   // 2
    }

    LHS 和RHS 引用都会在一直向外寻找a,知道全局作用域为止。

    有一个要注意的地方是:

    function fn(a){
         console.log(a+b);
         b = a;      
    }    
    
    fn(2);

    这里会抛出异常,异常点在哪就是  a + b,这里引擎会进行RHS 查询,结果没找到,会抛出ReferenceError: a is not defined

    但是对a进行LHS 查询的时候,如果最终也没有找到 a的声明,那么会在全局作用域下创建一个全局变量a(其实不是什么好事),如果是严格模式的话,

    那么就不会创建。

    还有一点,如果RHS 找到了这个变量,但是你尝试做不合理的操作就会抛出TypeError异常,比如:

    var a ;
    
    a = 2;
    
    a();

     

    成灰之前,抓紧时间做点事!!
  • 相关阅读:
    [转]JavaWeb学习总结(五十)——文件上传和下载
    [转]JavaWeb学习总结(四十九)——简单模拟Sping MVC
    [转]JavaWeb学习总结(四十八)——模拟Servlet3.0使用注解的方式配置Servlet
    [转]javaweb学习总结(四十七)——监听器(Listener)在开发中的应用
    [转]javaweb学习总结(四十六)——Filter(过滤器)常见应用
    [转]javaweb学习总结(四十五)——监听器(Listener)学习二
    js数组的方法
    神策埋点
    微信分享
    微信小程序
  • 原文地址:https://www.cnblogs.com/jony-it/p/10331488.html
Copyright © 2020-2023  润新知