预编译阶段就是作用域的创建阶段
预编译步骤
- 创建AO(GO)对象
- 查询形参和变量声明, 形参名和变量名作为AO(GO)属性名,值为undefined
- 形参和实参统一
- 查询函数声明,值为函数体(即function (){}) ,如果同名将覆盖变量,形参声明
AO对象为JS的函数作用域内部变量对象,仅供JS引擎访问
GO对象为全局作用域内部对象
习题
题目
function fn(a,c){
console.log(a)
var a = 123
console.log(a)
console.log(c)
function a(){}
if(false){ //
var d = 456
}
console.log(d)
console.log(b)
var b = function (){}
console.log(b)
function c(){}
console.log(c)
}
fn(1,2)
解题
function fn(a,c){
console.log(a) //function(){}
var a = 123
console.log(a) // 123
console.log(c) //function(){}
function a(){}
if(false){ // 如果 if(true) d为456
var d = 456
}
console.log(d) //undefined
console.log(b) //undefined
var b = function (){}
console.log(b) //function(){}
function c(){}
console.log(c) // function(){}
}
fn(1,2)
分析
函数执行时的AO对象{
a: undefined -> 1 -> function (){}
c: undefined -> 2 -> function (){}
d: undefined
b: undefined
}
预编译阶段结束
之后的AO对象{
a: function(){} -> 123
c: function(){}
d: undefined
b: undefined -> function(){}
}