预解析阶段,变量与函数声明提升与覆盖的本质是什么?
console.log(a);
var a = 1;
console.log(a);
function a() {
console.log(2);
}
console.log(a);
function a() {
console.log(3);
}
console.log(a);
a = 4;
console.log(a);
解析阶段,变量与函数声明提升,本质顺序是否是这样的:
1. 变量按顺序声明提升
2. 函数按顺序声明提升
3. 同名声明提升,后执行代码会覆盖先执行的
大致等同于:
// 变量声明,在函数声明提升之前
var a = undefined;
// 函数声明后覆盖变量
function a() {
console.log(2);
}
// 同名函数再次声明后覆盖前面的变量
function a() {
console.log(3);
}
// 等价代码
console.log(a);
// 对变量 a 赋值
a = 1;
console.log(a);
// 此位置代码被提升
// function a() {
// console.log(2);
// }
// console.log(a);
// function a() {
// console.log(3);
// }
// console.log(a);
// 对变量 a 赋值
a = 4;
console.log(a);
正在回答
同学你好,整体理解是对的,不过第三点“同名声明提升,后执行代码会覆盖先执行的”这句理解,老师要再补充一个注意的点,如下:
同名的变量或函数声明提升,后面书写的代码会覆盖前面的。但是对于变量和函数同名时,函数声明提升会覆盖变量声明提升,与代码书写的位置无关,示例:
函数与变量同名了,即使声明变量的代码书写在后面,但是函数声明提升会覆盖变量声明提升,所以最终输出结果为函数a。
祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星