脚本宝典收集整理的这篇文章主要介绍了JS预编译过程,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
console.LOG(a);
VAR a=1;
console.log(a);
将a存入预编译对象中,赋值为undefined; 真正的赋值语句当程序运行到时才会执行。
var a=undefined;
console.log(a);//undefined
a=1;
console.log(a);//1
先创建GO对象(Global Object),再创建AO对象(Activation Object)。 GO:先不看函数内部的代码
GO对象创建完成,开始读代码,直到读到全局调用test函数时,函数预编译,开始创建AO对象(预编译发生在函数执行的前一刻)
console.log(test); //function
function test(test) {
console.log(test);
var test = 234;
console.log(test);
function test() {}
}
test(1);
var test = 123;//test=123 覆盖属性test:function
console.log(test);//123
创建GO对象;
GO { }
找 变量声明,将 变量 作为GO属性名,值为undefined;
GO {
test : undefined
}
再找 函数声明,值赋予函数体;
GO {
test : function test(test) {
// … 整个函数体 }
}
GO对象创建完成,开始读代码,直到读到全局调用test函数时,函数预编译,开始创建AO对象(预编译发生在函数执行的前一刻)
全称:活跃对象/执行期上下文,在函数执行前执行函数预编译,此时会产生一个AO对象,AO对象保存该函数的参数变量。
function test(a) {
console.log(a);
var a = 2;
console.log(a);
function a () {}
console.log(a);
var b = function () {};
console.log(b);
function d(){}
}
test(1);
AO{
//此时AO对象为空
}
AO{
a:undefined; //函数参数
b:undefined; //函数里面声明的变量
}
AO{
a:1; //函数参数
b:undefined; //函数里面声明的变量
}
var b=function( ){ };时不会把函数体给到b属性的。b仍然是undefined. function a( ){ }; 才会覆盖a属性。
AO{
a:function a () {} //变量名一样,值覆盖
b:undefined, //函数里面声明的变量
d:function d () {}
}
function test(a) {
console.log(a);//function a;
var a = 2;//a=2; 覆盖AO中的属性值
console.log(a); //2;
function a () {} //预编译时已经处理过了,直接跳过
console.log(a); //2
console.log(b); //undefined; bs变量 尚未赋值
var b = function () {};//b=function(){}; 覆盖
console.log(b);//function (){};
function d(){}
}
test(1);
以上是脚本宝典为你收集整理的JS预编译过程全部内容,希望文章能够帮你解决JS预编译过程所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。