daily-interview / fe-interview

:smiley: 每日一道经典前端面试题,一起共同成长。
https://blog.csdn.net/u010494753
MIT License
172 stars 22 forks source link

js变量提升 #62

Open artdong opened 4 years ago

artdong commented 4 years ago

请写出一下代码运行结果

console.log(a);
var a = 1;
console.log(a);
function a() {}
console.log(a);
artdong commented 7 months ago

在JavaScript中,变量和函数声明会在代码执行之前被提升到其所在作用域的顶部。但是,这种提升只涉及到声明部分,而不包括赋值。

让我们针对你的例子重新解释:

console.log(a); // 输出:function a() {}
var a = 1;
console.log(a); // 输出:1
function a() {}
console.log(a); // 输出:1
  1. 变量和函数声明提升:

    • 变量 a 和函数 a 都被提升到作用域的顶部。在提升阶段,函数声明会覆盖变量声明。
  2. 代码执行:

    • 第一个 console.log(a); 遇到的是函数声明,因为在提升阶段,函数声明覆盖了变量声明。所以输出 function a() {}

    • var a = 1; 这一行的赋值部分不会影响提升阶段的输出。在提升阶段,a 被视为函数。

    • 第二个 console.log(a); 输出的是变量 a 的值,因为在这一行之前,变量 a 已经被重新赋值为 1。所以输出 1

    • 第三个 console.log(a); 输出的仍然是变量 a 的值,即 1

总体来说,提升阶段会将声明提升到作用域的顶部,函数声明会覆盖变量声明,但赋值部分不会在提升阶段执行。