首页 > 解决方案 > JavaScript 变量提升行为

问题描述

我可能遗漏了一些非常基本的东西,但无论如何我都想问这个

var a=100;
function f(){
    console.log(a)
    const a=150
}
console.log(a)
f(); 

将 const a=150 更改为 var a=150 时打印 100 并引发错误,返回 100 且未定义。我不确定为什么会发生这种行为,任何指向相关信息的指针都值得赞赏

标签: javascript

解决方案


一般来说,吊装是这样工作的:

  • 变量的声明移到顶部
  • 变量用一个特殊的“提升”值初始化
  • 当程序到达该var/let/const行时,该变量将使用该行中提到的值重新初始化(或者undefined如果没有)。

现在,您的示例可以简化为:

console.log(a)
let a = 150

这实际上是:

a = <hoisted value>
console.log(a)
a = 150

它会引发错误,因为对于letconst,提升的值是一个特殊对象,当您尝试访问它时会引发错误。

另一方面,提升的值为varjust undefined,所以这将打印undefined而不会引发错误:

console.log(a)
var a = 150

let/const此外,关于提升哪些变量类型以及vars的所谓“死区”存在一些混淆(包括这个线程) 。这样想更简单:一切都被提升了,也就是说,块中的所有变量绑定都是在进入块之前创建的。var和在这方面的唯一区别let/const是,后者在使用值初始化之前不允许使用绑定。

有关更多详细信息,请参阅https://stackoverflow.com/a/31222689/989121


推荐阅读