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();

     

    成灰之前,抓紧时间做点事!!
  • 相关阅读:
    zabbix 对/etc/ssh/sshd_config文件的监控 但status为unknowen
    Kotlin从零到精通Android开发
    谷歌官方 构建您的第一个应用 Kotlin版
    android studio 运行按钮为灰色的解决办法之一
    webapi发布到windows 2012的iis8里 出错
    Asp.net MVC WebApi项目的自动接口文档及测试功能打开方法
    Asp.net Web Api开发(第四篇)Help Page配置和扩展
    关于SNMP的MIB文件的语法简述
    Visual Stdio 2017增加SVN支持
    ffmpeg 多个音频合并 截取 拆分
  • 原文地址:https://www.cnblogs.com/jony-it/p/10331488.html
Copyright © 2011-2022 走看看