JS运行三部曲
1.语法分析
先全部扫一遍 看有没有语法错误.
2.预编译(执行前一刻)
函数声明整体提升
变量 声明提升
3.解释执行
(解释一行执行一行)
预编译执行四部曲
函数中
1.创建AO对象 (Activation Object (执行期上下文))
2. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
全局中
1. 生成一个叫GO 对象 Global Object
(window就是全局)
例:
<script>
/*首先执行前会进行全局预编译:
先把全局的变量声明找出来值为undefined 和函数声明 值赋予函数体,提升到最上端
GO{a:undefined;
demo:function demo(e){.....}
} 然后开始执行*/
a = 100; //1.执行到这里 GO{a:100; 把100 赋值给a 然后下一行
function demo(e){ //2.执行到这里 因为demo:function demo(e){.....} 提升 所以忽略 然后下一步
function e(){} //5.提升 忽略
arguments[0] = 2; //6.实参值改变 形参也改变 AO{ e:2;
console.log(e); //7. 输出 2
if (a){ //8. a此刻为 AO{ a:undefined; 所有if整段代码不执行
var b = 123;
}
var c; //9.提升 忽略
a = 10; // 10. AO{ a:10;
var a; //11.提升 忽略
console.log(b); //12.因为AO{ b;undefined; 所以 输出 undefined
f = 123; //13.因为 AO中没有f ,所以把f放入GO中GO{f:undefined; 把123赋值给它GO{f:123;
console.log(c); //14.因为AO{ c;undefined; 所以输出 undefined
console.log(a); //15. 看10步 AO{ a:10; 输出 10 执行完毕
}
var a; //3. 提升 忽略 下一步
//4.函数执行前进行函数预编译
/*4.1找形参和变量声明,将变量和形参名作为AO属性名,值为undefine
AO{ e:undefined;
c:undefined;
a:undefined;
}
4.2将实参值和形参统一
AO{ e:1;
c:undefined;
a:undefined;
}
4.3在函数体里面找函数声明,值赋予函数体
AO{ e: function e(){};
b;undefined;
c:undefined;
a:undefined;
}
*/
demo(1);
console.log(a); //100 //16. 看1. GO{a:100; 输出 100
console.log(f); //123 //17.看 13. GO{f:123; 输出 123
</script>