js代码在执行时,会先进行以下几个步骤:
- 语法检查
- 预编译
预编译发生在函数执行的前一刻。
函数预编译的步骤
-
创建AO对象 Activation Object(执行期上下文)
-
找形参和变量声明,将形参和变量作为 AO 对象的属性名,值为undefined。
-
将实参值和形参统一。
-
在函数体里面找函数声明,值赋予函数体
将函数声明提升,将 变量 提升,复制为undefined
function fun(a){
console.log(a)
var a = 123
console.log(a)
function a(){}
console.log(a)
var b = function(){} //在这边函数声明已经往上提了,所以在这之前如果b的值经过重新赋值,就为新的值了
console.log(b)
function d(){}
}
fun(1) function a(){} 123 123 function(){}
预编译不只发生在函数体内,全局也是。
全局生成的是一个 GO === window 对象 Global Object