认识 javascript 作用域

认识作用域

1 编译原理

  • 词法分析,分词
  • 语法分析,转成抽象语法树
  • 代码生成,机器可执行的代码

2 理解作用域(了解作用域主要承担什么工作)

  • 变量的赋值
    1
    var a = 2;

变量的赋值会执行两个操作,第一个是在当前作用域下声明一个变量(如果这个变量不存在),在运行的时候引擎会在作用域中查找该变量,如果可以找的到则对该变量进行赋值,没有找到则抛出异常。

  • RHS & LHS
    取值操作以及赋值操作。对变量进行赋值 则进行的是 LHS 查询,如果是为了获取某一个值,则进行的是 RHS 查询。
    1
    2
    3
    4
    5
    var a = 2;
    console.log(a);

    var a = 2; LHS 为 a 赋值
    console.log(a); RHS 查找 a 的值

3 作用域嵌套

3.1 作用域嵌套理解

当一个块或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套。因此,在当前作用 域中无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量, 或抵达最外层的作用域(也就是全局作用域)为止。

4 异常

4.1 RHS & LHS 区别
1
2
3
4
5
6
functuon foo(a) {
console.log(a+b);
b = a;
}

foo(2);

第一次对 b 进行 RHS 是无法查询到该变量的,所以会抛出一个 ReferenceError 异常。但是 如果进行的是 LHS 操作,一种查询到 全局作用域都无法找到该值,就会在 全局作用域 下声明一个变量,前提是在 非严格模式 下。

5 小结

作用域是一套规则,用以确定在何处以及如何查找变量(LHS & RHS),变量的赋值以及变量的取值。

下一篇将更加深入的了解作用域,词法作用域。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2019-2020 我爱吃包子
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信