JS执行三部曲
- 语法分析:全篇扫描,看有没有低级语法错误
- 预编译:
(1)创建AO对象(执行期上下文)
(2)找形参和变量声明,作为AO属性名值为undefined
(3)将实参与形参统一
(4)在函数体找函数声明,将值赋予函数体 - 解释执行:
作用域
预编译发生在函数调用前一刻,js是解释执行,未执行函数前不能知道其内容及父级不能访问子级作用域。
作用域链
scope:执行上下文(栈)
- 当a定义时,只有scope[0](定义时上下文)此处指向GO全局作用域。
- 当a执行时,创建AO放入作用域链最顶端(子作用域里对父作用域是引用并非独立)
当函数执行完将消毁上下文,先销毁自己的AO,按栈的进出规则销毁(没有闭包的情况下)
当再次执行a将产生新的上下文,与之前的无关。
立即执行函数
(function () {} ()) // w3c建议
(function () {})()
- function () {} ()
- function () {} ()
!function () {} ()
- 只有表达式才能被执行符号执行 ()
- 可执行函数被执行后放弃函数名字