《你不知道的JavaScript》·上卷 阅读笔记

156 阅读2分钟

第一部分作用域和闭包

第一章 作用域

1、什么是作用域
代码在编译和执行中查找变量(标识符)的规则限制,确定执行代码对标识符的访问权限。
2、什么是作用域查询
作用域查询分为两种:RHS查询、LHS查询

RHS查询: 查询到标识符的位置,然后取值,不做赋值操作。类似于去银行取钱(找到银行,取出卡里的钱).

LHS查询: 查询到标识符的位置,然后进行赋值操作。类似于去银行存钱(找到银行,把钱存进去).
```
    function foo(a) {
        var b = a;
        return a + b;
    }
    var c = foo(3)
```
上边代码中存在3处LHS查询,4处RHS查询。
3、什么是作用域链
当块级或函数作用域嵌套在另一个块级或函数作用域中,就形成了作用域链。

引擎从当的执行作用域开始查找变量,如果找不到,就向上一级进行查找。当抵达最外层的全局作用域时,无论找到还是找不到,查询过程都会停止。

RHS查询、LHS查询在查找变量的时候,都会遵循这个查找过程。
4、异常
非严格模式下:

LHS查询如果到全局作用域下依然没有找到这个变量,会在全局作用域下创建声明该变量。
RHS查询如果到全局作用域下依然没有找到这个变量,会抛出ReferenceError错误。

严格模式下:

LHS查询如果到全局作用域下依然没有找到这个变量,会抛出referenceError错误,不会隐式的创建该变量。
RHS查询如果到全局作用域下依然没有找到这个变量,会抛出ReferenceError错误。
 ReferenceError是作用域查找该变量失败,引起的错误。
 TypeError 是在作用域下找到了该变量,非法使用该变量引起的错误。