- var a = 1;
- console.log(a);
第一行代码 var a=1, 会被引擎看成两句话: var a 和 a=1.
首先, 会由编译器询问当前作用域内 (这里就是全局作用域) 是否存在已经声明的变量 a, 如果存在则忽略 var a, 否则在当前作用域内声明变量 a(这时, 作用域内就有了变量 a. 测试时可以发现, 即便两行代码倒置顺序, 并不会抛 ReferenceError, 而是打印 undefined, 说明引擎首先会提前通过编译器执行代码中所有的声明操作).
其次, 编译器声明变量 a(即在作用域内生成了变量 a)后, 就会编译 a=1 语句, 编译后的语句由执行引擎执行.
最后, 在执行引擎执行时, 也就是在执行被编译后的 a=1 时, 首先会进行 LHS(左查找, 目的是找到变量所在的容器, 顺着作用域链查找, 如果最终在全局作用域中仍未找到, 则会默认在全局作用域内声明该变量, 但如果是 "use strict", 则与 RHS 未找到一样, 抛 ReferenceError), 然后在赋值 1.
- var o = {};
- o.b = 1;
- console.log(o.b);
引擎在执行 o.b=1 时(假设已被编译器编译), 首先会 LHS 查找变量 o, 然后使用对象访问规则访问 o 的 b 属性, 这里就是对 b 赋值 1.
JS 简记
来源: http://www.bubuko.com/infodetail-2580795.html