JS执行三部曲
1.语法分析。系统会通篇扫描代码,查看是否有代码的语法错误。
2.预编译.分析结束后,就会进行预编译。
3.解释执行
function test(){ consoel.log("a"); } test();// a
上面test()代码很明显是可以执行结果是a
但是如果这样那?
test(); function test(){ consoel.log("a"); }
能输出吗?可以,那么疑问来了JS不是解释语言吗?test()在执行的时候,函数test应该还没有定义但是为什么能够执行出来结构那?这就是预编译做的事情。
再来一个
console.log(a);// undefined var a = 10;
现在为什么a变量输出结果是nudefined报错显示。他不是应该没有定义报错吗?那么这是什么原因,可以给你说这是预编译这哥们做的。
为什么现在给你两句话:
1.函数声明整体提升
2.变量 声明提升
就是你写一个函数,不管你写在哪里系统总是会把函数提升带代码逻辑最前面。
--以上的是函数的执行上下文
还有全局的执行期上下文:(GO),只不过比函数的执行期上下文少了一步,第三部,实参形参相统一。第一步变成了胜场GO对象。
其实GO就是window
所以说你在全局中声明一个变量a;然后console.log(a);就是去GO中访问a也就是window.a;先生成GO,全局的GO生成在全局执行的前一刻。
console.log(test); function test(test){ console.log(test);//fu var test=234; console.log(test);//234 function test(){} } test(1); var test=2;
GO{
test : undefined
}
GO{
test : function test(test){
//...
}
}第一行代码结果就是:
function test(test){
//...
}
执行test(1);
先 生成AO{
test : undefined
}
预编译不会看if语句的括号