js运行三部曲
1.语法分析
2.预编译
3.解释执行
imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象GO所有
一切声明的全局变量,全是window的属性
预编译发生在执行之前,且预编译执行的地方不会在执行
函数每次执行的时候,都会产生AO,并且每次调用完之后AO对象会销毁
函数预编译
1.创建AO对象
2.找形参和变量声明,将形参和变量作为AO属性名,值为undefined
3.形参值和实参值相统一
4.在函数体里面寻找函数声明,值赋予函数体
以上的预编译按顺序执行,后面的会覆盖前面的
全局预编译
1.创建GO对象
2.变量作为GO的属性名,值赋为undefined
3.寻找函数,值赋为函数体
function fn(a){
console.log(a);
var a = 123;
console.log(a);
function a(){}
console.log(a);
var b = function () {}
console.log(b);
function d(){}
}
fn(1);
预编译步骤实例
1.创建AO对象
AO{
a: undefined
b: undefined
}
3.将形参和实参值统一
AO
{
a: 1
b: undefined
}
4.在函数体里面寻找函数声明,值赋予函数体
AO
{
a: function a() {}
b: undefined
d: function d() {}
}
创建AO对象之后,执行函数
输出的东西都在AO对象里面
第一个输出: function a () {}
AO{
a: 123 // var a = 123;
b: undefined
d: function d() {}
}
第二个输出: 123
第三个输出: 123
AO{
a: 123
b: function () {} // var b = function() {}
d: function d() {}
}
第四个输出: function b() {}
全局的与此类似,只是建立的是GO对象
作用域链
函数的[[scope]]属性,只有系统可以调用的属性,
function a() {
function b() {
var b = 234;
}
var a = 123;
b();
}
var glob = 100;
a()
a的scope chain :

B在a的基础上增加自己的AO并且在最上面构成他的作用域链,而每当执行的时候,从最上面开始找变量或函数,这也很好的解释了javascript中函数内部可以用全局变量,因为全局变量全部都在GO当中,所以不会出现报错的情况。
本文深入解析JavaScript的运行过程,包括语法分析、预编译及解释执行三个阶段。阐述了全局与函数预编译的区别,以及作用域链的形成原理,帮助理解变量提升和函数内部调用全局变量的机制。
358

被折叠的 条评论
为什么被折叠?



