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,里面声明的变量,该声明还是要声明
来看一道题目: