【发布时间】:2017-12-21 09:58:58
【问题描述】:
下面的代码将产生8,因为第二个声明将覆盖第一个声明。是的!完全有道理。
示例 1
function foo(){
function bar() {
return 3;
}
return bar();
function bar() {
return 8;
}
}
console.log(foo()); // ---> 8
以下代码生成3,这意味着它是第一个被调用的表达式。
示例 2
function foo(){
var bar = function() {
return 3;
};
return bar();
var bar = function() {
return 8;
};
}
console.log(foo()); // ---> 3
我倾向于得出结论,在 JavaScript 中,只使用第一个声明的变量,如上所示。但是,下面的代码会产生7(嗯……挠头)
示例 3
var a = 4;
var a = 7;
console.log(a); //---> 7
最终,我将使用let 或const(以防止多次声明同一个变量)来声明变量而不是var,但我试图理解为什么示例2和3中产生的结果如此难以预测。谢谢。
【问题讨论】:
-
只有一个变量(声明被提升),但赋值(初始化)按顺序发生。
-
为什么让 a=1; let a =1 给出错误?
标签: javascript scope hoisting