gpt4 book ai didi

javascript - 是什么导致 "var"和 "let"之间的不同行为,当为它们分配一个抛出错误的函数的返回值时

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:06:37 24 4
gpt4 key购买 nike

请在下图中找到代码。1. 将实际抛出错误的函数的返回值赋值给使用关键字'let'声明的变量'withLet'。2.调用'withLet',出现错误:'withLet is not defined'。3. 尝试使用'let'断言'withLet',错误显示'withLet'已经被声明。

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

我很好奇是什么导致了这两种情况之间的不同行为。 “未定义”和“已声明”描述的是同一个变量,这很奇怪。

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
//<anonymous>:1:1
//(anonymous) @ VM2484:1
withVar
//undefined
let withLet = 'sth'
//VM2520:1 Uncaught SyntaxError: Identifier 'withLet' has already been
//declared
//at <anonymous>:1:1
//(anonymous) @ VM2520:1
withVar = 'sth'
//"sth"

截图:

最佳答案

var 的声明变量被提升——变量名初始化被提升到包含函数的顶部(或者,如果没有函数,则提升到外部 block 的顶部)。所以

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

被解释器解析为

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

let 则不同。 - let一旦 let __ 变量被初始化线路运行。有赋值时,先解析右边;如果右侧抛出错误,它永远不会到达左侧,并且用 let 声明的变量永远不会正确初始化;它会留在 demilitarized zone / temporal dead zone永远,因此尝试重新分配它会引发错误。

这有点奇怪,因为代码在控制台 中运行 - 通常,JS 在 <script> 中运行标记,如果发生这样的错误,通常将不再运行任何代码,而且用 let 声明的变量的事实不再可重新分配是您最不担心的事情。


以上是早期 Chrome 版本中的问题。但是in Chrome 80+ , 重新声明 let现在允许,所以the error

Uncaught SyntaxError: Identifier 'withLet' has already been declared

不应该再出现,不管之前的变量初始化是否成功:

enter image description here

关于javascript - 是什么导致 "var"和 "let"之间的不同行为,当为它们分配一个抛出错误的函数的返回值时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54231651/

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