JS执行顺序
1,语法分析
在进行代码运行时,会先扫描整个代码,查看是否有语法错误
2,预编译
3,解释执行
--------------------------------------------
预编译:


依然能够执行,是因为有预编译的作用
看下面三段代码:






前提知识点:
imply global 暗示全局变量:即任何变量,如果有任何变量未经声明,就赋值,则此变量会作为全局变量,归window所有。


全局声明的变量,也归window所有


window就是全局的域,比如你 var a = 10;那我们去哪里拿到a呢,a就在window里面,相当于:
window{
a :123
}


b是由于未经声明,就使用的变量,所以b就归window所有,而a不是

函数预编译的执行过程:
1,创建AO对象(Activation Object 执行期上下文)
2,找到形参和变量声明,并将形参和变量名作为AO对象属性名,值为undefined
AO{
a :undefined
b :undefined
}
3,将实参值和形参统一
AO{
a :1
b :undefined
}
4,找函数体里的函数声明(b不是哦,是函数变量),值赋予函数体
AO{
a :function a() {}
b :undefined
d :function d() {}
}
接下来看执行:

(1),去AO对象里输出a ,![]()
(2),a的声明以及声明过了,所以不用去看,后面是对a的赋值
同时
AO对象改变:
AO{
a :123
b :undefined
d :function d() {}
}
(3)去AO对象里找到a,并打印![]()
(4)预编译处理过了,所以不看了
(5)还是去AO里面找到a,打印出123![]()
(6)声明b预编译已经处理过了,所以看后面对b的赋值,同时AO对象改变
AO{
a :123
b :function() {}
d :function d() {}
}
(7)去AO里面找到b,并且输出![]()
(8)预编译处理过了,所以不看了
整体的输出:

还有一点注意的是:预编译发生在函数执行的前一刻
看下面两道题



全局预编译的执行过程:
1,生成一个GO对象 (Global Object)
2,找到变量声明,并将变量作为GO对象属性名,值为undefined
3,找到函数声明,并将函数体作为值赋值


GO === window
接下来再看一道题目:


再看一道题


再看下面一道:


预编译不管if的判断,打破if,里面声明的变量,该声明还是要声明
来看一道题目:


3142

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



