1 任何JavaScript代码片段执行前都要编译
2 变量赋值操作两个步骤,首先在当前作用域声明该变量(假设该变量之前未被声明),之后在运行时在作用域中查找该变量,若能知道,就进行赋值
3 LHS:赋值操作的目标是谁 RHS:谁是赋值操作的源头,都从当前作用域开始,一层一层向上找,最后到全局作用域停止查找。
注意隐式的LHS a=2
4 严格模式禁止自动或者隐式创建全局变量
5 ReferenceError同作用域判别失败相关,TypeEror则代表作用域判别成功,但对结果的操作是不合法的。
6 作用域是一套规则,用于确定在何处以及如何查找变量(标识符),=操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作。
7 词法作用域是由你在写代码时将变量和块作用域写在哪决定的。词法作用域只会查找一级标识符,如foo.bar.baz,词法作用域只会试图查找foo标识符,找到这个变量后,对象属性访问规则则会分别接管对bar和baz属性的访问。
8 作用域查找会在知道第一个匹配的标识符时停止。
9 eval()和with会欺骗词法作用域,所以不要使用。