• 作用域与闭包


    1.变量的赋值操作,会有二个阶段。

    1.1.编译器会询问作用域是否有声明过某变量,如var a,如果没有,则添加到作用域中,有,则跳过。

    1.2.引擎生成运行所需代码时,如a=2,询问作用域是否有此'a'变量,如果有,则使用,如果没有,则往上级查找,一直查到全局作用域中,还未找到,则抛出异常

    2.引擎查找变量的两种类型

    2.1 LHS:赋值操作的目标是谁。如 a=2;为=2找到一个目标, 或  b=a+1;为a+1找到一个目标

    2.2 RHS:谁是赋值操作的源头。如console.log(a),对a进行RHS引用,foo(2),对foot进行RHS引用

    3.  LHS与 RHS查询失败

    3.1 RHS查询失败,在所有作用域中都找不到该变量,如 var b; b=a,找不到a,则会抛出 ReferenceError(引用错误)

    3.2 LHS查询失败,在非严格模式下,会重新创建一个该变量,如 a=1,会在全局作用域中创建该变量,在严格模式下,也会抛出 ReferenceError(引用错误)

    3.3 RHS查询到一个变量但是对它进行不正确的赋值,会抛出TypeError,比如 var a=444; a();对一个非函数类型进行函数调用,或是调用null与undefined类型的属性

    3.4 ReferenceError与作用域有关,TypeError代表作用域判断成功,但是对结果操作不合法

    3.5 获取变量的值,使用RHS查询,而对变量赋值,使用LHS查询

  • 相关阅读:
    C++ const
    facebook hacker cup 2013资格赛第二题
    最大全1子矩阵
    java HashMap的keyset方法
    树状数组
    Java entry
    一个数学证明:1(1x1)(1x2)...(1xn)<=x1+x2+...+xn, xi在[0,1]
    传教士野蛮人过河问题python
    在cmd中为命令设置别名以及启动cmd时自动执行bat
    合取Λ,析取V,容易记混吗?
  • 原文地址:https://www.cnblogs.com/zhangxiong/p/5479727.html
Copyright © 2020-2023  润新知