gpt4 book ai didi

javascript - 用 let 或 const 声明的变量是否被提升?

转载 作者:行者123 更新时间:2023-12-01 17:50:10 24 4
gpt4 key购买 nike

我玩 ES6 有一段时间了,我注意到虽然用 var 声明的变量按预期方式提升了......

console.log(typeof name); // undefined
var name = "John";

...用 letconst 声明的变量似乎在提升方面有一些问题:

console.log(typeof name); // ReferenceError
let name = "John";

console.log(typeof name); // ReferenceError
const name = "John";

这是否意味着用 letconst 声明的变量不会被提升?这里究竟发生了什么? letconst在这件事上有什么区别吗?

最佳答案

@thefourtheye 说这些变量在声明之前无法访问是正确的。然而,它比这要复杂一些。

Are variables declared with let or const not hoisted? What is really going on here?

所有声明(varletconstfunctionfunction*, class) 在 JavaScript 中被“提升”。这意味着如果在范围内声明了名称,则在该范围内标识符将始终引用该特定变量:

x = "global";
// function scope:
(function() {
x; // not "global"

var/let/… x;
}());
// block scope (not for `var`s):
{
x; // not "global"

let/const/… x;
}

函数作用域和 block 作用域都是如此1

var/function/function*声明和let/const的区别code>/class声明就是初始化
前者是在范围顶部创建绑定(bind)时使用 undefined 或 (generator) 函数初始化的。然而,词法声明的变量保持未初始化。这意味着当您尝试访问它时会抛出一个 ReferenceError 异常。它只会在 let/const/class 语句被评估时初始化,所有之前(上面)被称为 temporal dead zone .

x = y = "global";
(function() {
x; // undefined
y; // Reference error: y is not defined

var x = "local";
let y = "local";
}());

请注意,let y; 语句使用 undefined 初始化变量,就像 let y = undefined; 一样。

时间死区不是句法位置,而是变量(作用域)创建和初始化之间的时间。只要不执行该代码(例如函数体或简单的死代码),在声明上方的代码中引用变量就不是错误,如果您在初始化之前访问变量,即使访问代码在声明下方(例如,在过早调用的提升函数声明中)。

Is there any difference between let and const in this matter?

不,就吊装而言,它们的工作原理相同。它们之间唯一的区别是一个constant必须并且只能在声明的初始化部分赋值(const one = 1;,两者都是const one; 和以后的重新分配,如 one = 2 是无效的)。

1:当然,var 声明仍然只在函数级别起作用

关于javascript - 用 let 或 const 声明的变量是否被提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33585206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com