Javascript:如何在if块内提升(或不提升)let?
在我看来,我已经理解了JavaScript作用域和提升的基本概念。在这方面,这对我帮助很大 不过,最近我遇到了一些事情,这让我有点吃惊。考虑下面的代码:Javascript:如何在if块内提升(或不提升)let?,javascript,scope,ecmascript-6,var,let,Javascript,Scope,Ecmascript 6,Var,Let,在我看来,我已经理解了JavaScript作用域和提升的基本概念。在这方面,这对我帮助很大 不过,最近我遇到了一些事情,这让我有点吃惊。考虑下面的代码: var a = 1; if (true) { console.log(a); let a = 2; } console.log(a); 根据我所学到的知识,我希望它能输出未定义的和1。尽管它会导致未捕获引用错误:未定义a 我的理解是,上述代码应等同于(作为的声明部分,让a=2;应提升到最近的封闭块-在这种情况下,如果,则为): 顺
var a = 1;
if (true) {
console.log(a);
let a = 2;
}
console.log(a);
根据我所学到的知识,我希望它能输出未定义的和1
。尽管它会导致未捕获引用错误:未定义a
我的理解是,上述代码应等同于(作为的声明部分,让a=2;
应提升到最近的封闭块-在这种情况下,如果,则为):
顺便说一下,这段代码会产生未定义的和1
,正如我所期望的那样
我的问题是:
- 变量是否在最近的封闭块内用
let
吊起?
- 如果是,为什么第一个块中的代码会导致
未捕获引用错误:未定义a
有一个称为的句点,它影响用and声明的变量
释义:
时间死区-是进入范围和变量之间的一段时间
正在声明,其中无法访问变量
因此,如果我们要在第一个代码片段中标记时间死区,从以下问题:
var a = 1;
if (true) {
/* start of the Temporal Dead Zone */
console.log(a); /* code in the Temporal Dead Zone */
/* last line of the Temporal Dead Zone */
let a = 2; /* end of the Temporal Dead Zone */
}
console.log(a);
当然,也提到了这一点(以及其他棘手的情况):
在ECMAScript 2015中,let绑定不受变量提升的约束,这意味着let声明不会移动到当前执行上下文的顶部。在初始化之前引用块中的变量会导致ReferenceError(与使用var声明的变量相反,该变量只具有未定义的值)。从块的开始到初始化处理,变量处于“时间死区”
上面的摘录后面是以下代码:
function do_something() {
console.log(bar); // undefined
console.log(foo); // ReferenceError
var bar = 1;
let foo = 2;
}
为了明确地解决这个问题:如中所述,使用声明的变量在其最近的封闭块内提升,但未初始化。它连续地导致变量行为,好像它们没有被提升=)有一个称为的周期,它影响用和声明的变量
释义:
时间死区-是进入范围和变量之间的一段时间
正在声明,其中无法访问变量
因此,如果我们要在第一个代码片段中标记时间死区,从以下问题:
var a = 1;
if (true) {
/* start of the Temporal Dead Zone */
console.log(a); /* code in the Temporal Dead Zone */
/* last line of the Temporal Dead Zone */
let a = 2; /* end of the Temporal Dead Zone */
}
console.log(a);
当然,也提到了这一点(以及其他棘手的情况):
在ECMAScript 2015中,let绑定不受变量提升的约束,这意味着let声明不会移动到当前执行上下文的顶部。在初始化之前引用块中的变量会导致ReferenceError(与使用var声明的变量相反,该变量只具有未定义的值)。从块的开始到初始化处理,变量处于“时间死区”
上面的摘录后面是以下代码:
function do_something() {
console.log(bar); // undefined
console.log(foo); // ReferenceError
var bar = 1;
let foo = 2;
}
为了明确地解决这个问题:如中所述,使用声明的变量在其最近的封闭块内提升,但未初始化。java,C++,C++,Java……,这是一个非常奇怪的名字,对于一个多语言的AbhinavGauniyal来说,这是一个非常奇怪的名字。名单还在继续。它们都将显示变量未定义
错误,但其中任何一个都不被称为“暂时死区”,因为由于没有提升,这一点非常明显。@AbhinavGauniyal所有这些都没有闭包,不是暂时死区,只是“上面的声明没有用处”。在JavaScript中,您可以执行函数示例(){alert(x)}让x=42;示例()
其中x
在上面的let
范围内。是的,但是从“let绑定不受变量提升”中,我想人们可能会认为let没有被提升(即使声明没有被提升,只是绑定)这是一个非常奇怪的名字,对于一种行为,这是多语言共同的@ AbhinavGauniyal,在什么其他共同语言是这种行为,它是如何被称为“@贝尔吉C,C++,java…名单还在继续。它们都将显示变量未定义
错误,但其中任何一个都不被称为“暂时死区”,因为由于没有提升,这一点非常明显。@AbhinavGauniyal所有这些都没有闭包,不是暂时死区,只是“上面的声明没有用处”。在JavaScript中,您可以执行函数示例(){alert(x)}让x=42;示例()
其中x
在上面的let
范围内。是的,但是从“let绑定不受变量提升”中,我想人们可能会认为let没有被提升(即使声明没有被提升,只是绑定)