function fn(a, c) {
console.log(a);
var a = 123;
console.log(a);
console.log(c);
function a() {}
if (false) {
var d = 678;
}
console.log(d);
console.log(b);
var b = function () {};
console.log(b);
function c() {}
console.log(c);
}
fn(1, 2);
js执行时会经历预编译阶段
预编译步骤:
- 创建AO对象,供js内部访问
- 找形参和变量声明 作为AO对象的属性,值为undefined
- 形参和实参相统一
- 找函数声明 会覆盖变量的声明
第一步:创建AO对象
let AO = {};
第二步:找形参和变量声明 作为AO对象的属性,值为undefined
AO = {
a: undefined, //形参
c: undefined, //形参
d: undefined, //变量声明
b: undefined, //变量声明
};
第三步:形参和实参相统一
AO = {
a: 1,
c: 2,
d: undefined,
b: undefined,
};
第四步:函数声明覆盖变量声明
AO = {
a: function a() {},
c: function c() {},
d: undefined,
b: undefined,
};
至此 预编译阶段结束 开始逐行执行js
console.log(a); // 预编译阶段 function a() {}
var a = 123;
console.log(a); // 123
console.log(c); // 预编译阶段 function c() {}
function a() {}
if (false) {
var d = 678;
}
console.log(d); // undefined
console.log(b); // undefined
var b = function () {};
console.log(b); // function () {}
function c() {}
console.log(c); // function c() {}