gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:13:18 25 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/class声明是初始化
前者初始化为 undefined或在范围顶部创建绑定(bind)时的(生成器)函数。然而,词法声明的变量保持未初始化。这意味着 ReferenceError当您尝试访问它时会引发异常。它只会在 let 时被初始化。/const/class语句被评估,之前(以上)称为时间死区的所有内容。

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?

不,就提升而言,它们的工作方式相同。它们之间的唯一区别是 const ant 必须并且只能在声明的初始化部分中赋值(const one = 1;const one; 和后来的重新赋值如 one = 2 都是无效的)。

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

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

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