js执行过程三步:
- 语法分析
通篇扫描是否存在语法错误。比如少个括号之类
- 预编译
函数声明 整体提升
test();
function test() {
console.log(1);
}
变量 声明提升
console.log(a); //输出 undefined
var a = 123;
预编译前奏
- imply global 暗示全局变量:如果变量未经声明就使用,即为全局变量;window
- 全局上的任何变量,即使声明了,也归window所有 window就是全局的域
function test() {
var a = b = 123;
}
test();
console.log(a); // a is not defined
console.log(b); // 123 未声明的变量 即为 window所有。window.b => 123
3. 预编译发生在函数执行的前一刻
// 1. 创建AO对象(activation object)执行期上下文
// 2. 找形参和变量声明,将变量和形参名作为AO属性名,值未undefined
// 3. 将实参值和形参值统一
// 4. 在函数体里面找函数声明,值赋予函数体
// GO 同理 global object GO === window
// AO 有值 AO取 没值就往GO取
// 第二步
//AO{
// a: undefined,
// b: undefined
//}
//第三步
//AO {
// a: 1,
// b: undefined
//}
//第四步
//AO{
// a: function a() {},
// b: undefined,
// d: function d() {}
//}
function test(a) {
console.log(a); // function a() {};
var a = 123; // a = 123
function a() {}
console.log(a); // 123;
var b = function() {}
console.log(b); // b => function (){}
function d() {}
}
test(1)
- 解释执行
读一行执行一行