-
语法分析
-
预编译
-
解释执行
下面两句话能解决问题,但解决不了深入的问题,其实原理是 预编译产生的两个现象(规律)。
- 函数声明整体提升
- 变量 声明提升
预编译前奏
imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有(全局对象是window)。
eg: a = 123;
eg: var a = b = 123; 这里的 b 是没有声明的,所以归window所有,所以如果这个表达式出现在局部函数,那么b会变成全局变量,而a是局部变量,值都是123
一切声明的全局变量,全是window的属性。
eg: a = 123; 相当于 window.a = 123;
window就是全局的域
预编译
eg - 预编译前:
预编译发生在函数执行前的前一刻
- 创建AO对象(Activation Object)
- 找形参和变量声明,将变量和形参名作为AO属性名,值为undefuned
- 将实参值和形参统一
- 在函数体里面找函数声明,值赋予函数体
eg - 预编译后:
全局的预编译原理是一样的,只是对象是GO(Global Object),window其实是GO的引用
2013百度面试题--