zoukankan      html  css  js  c++  java
  • 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();

     

    成灰之前,抓紧时间做点事!!
  • 相关阅读:
    POJ 1426 Find The Multiple(数论——中国同余定理)
    POJ 2253 Frogger(Dijkstra变形——最短路径最大权值)
    POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
    POJ 3278 Catch That Cow(模板——BFS)
    HDU 1071 The area
    HDU 1213 How Many Tables(模板——并查集)
    POJ 1611 The Suspects
    light oj 1214 Large Division
    POJ 1258 Agri-Net(Prim算法求解MST)
    POJ 2387 Til the Cows Come Home(模板——Dijkstra算法)
  • 原文地址:https://www.cnblogs.com/jony-it/p/10331488.html
Copyright © 2011-2022 走看看