关于javascript:什么原因导致“var”和“let”之间的不同行为为它们分配一个抛出错误的函数的返回值

What causes the different behaviors between “var” and “let” when assign them a returned value of a function which throws an error

请在下图中找到代码。1。将实际引发错误的函数的返回值赋给使用关键字"let"声明的变量"withlet"。2。调用"Withlet",发生错误:"未定义Withlet"。三.尝试使用"let"断言"Withlet",错误表明已声明"Withlet"。

但是"var"的悖论并不存在(请在下图中找到)。

我很好奇是什么导致了这两种情况下的不同行为。"未定义的"和"已声明的"描述同一个变量是非常复杂的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let withLet = (function() {throw 'error!'})()
var withVar = (function() {throw 'error!'})()
//VM2470:1 Uncaught error!
//(anonymous) @ VM2470:1
//(anonymous) @ VM2470:1
withLet
//VM2484:1 Uncaught ReferenceError: withLet is not defined at
//:1:1
//(anonymous) @ VM2484:1
withVar
//undefined
let withLet = 'sth'
//VM2520:1 Uncaught SyntaxError: Identifier 'withLet' has already been
//declared
//at :1:1
//(anonymous) @ VM2520:1
withVar = 'sth'
//"sth"

截图:

></P></p>
<div class=


提升var变量的声明-将变量名初始化提升到包含函数的顶部(如果没有函数,则提升到外部块的顶部)。所以

1
var withVar = (function() {throw 'error!'})()

被解释器解析为

1
2
var withVar;
withVar = (function() {throw 'error!'})()

let __行运行时,let--let变量初始化,情况就不一样了。当有赋值时,首先解析右手边;如果右手边抛出一个错误,它就永远不会到达左手边,用let声明的变量也永远不会得到正确的初始化;它将永远停留在非军事区/暂时死区中,因此尝试重新分配会抛出一个错误。

这有点奇怪,因为代码是在控制台中运行的——通常情况下,JS运行在一个标记内,如果发生这样的错误,通常不会再运行更多的代码,并且用let声明的变量不再可重新分配这一事实是您最不担心的。