繁体   English   中英

为什么可以在等待后在控制台中重新分配 `const x`?

[英]Why is it possible to reassign `const x` in the console after an await?

编辑:我发现你甚至不需要这个功能。 这对我也有效:

const x = await 'hello'
x = 'something else'

请注意,没有await它会引发错误。

首先定义一个异步函数,

async function a() {
  return new Promise(resolve => {
    resolve('hello')
  })
}

然后将x分配给'hello'

const x = await a()

然后重新分配x

x = 'something else'

如果x是一个常量变量,为什么可以重新赋值? 有什么明显的东西我在这里失踪了吗?

这是完整的代码(在 Chrome 80.0.3987.87 上的浏览​​器控制台中测试):

async function a() {
  return new Promise(resolve => {
    resolve('hello')
  })
}

const x = await a()

x = 'something else'

我无法重现您所描述的内容。 它给我抛出了一个错误。

 async function a() { return new Promise(resolve => { resolve('hello') }) } (async () => { try { const x = await a(); x = 'something else'; console.log("worked", x); } catch (err) { console.log("didn't work", err.toString()); } })()

通过您更新的问题,我看到当您在 chrome 开发人员控制台中输入代码时会发生这种情况。 此外,您的代码在 async 函数之外使用 await 。 顶级 await 还不是 javascript 标准的一部分,尽管它正在通过审批流程 开发工具确实可以让您这样做,但如果结果的行为是非标准的,我不会感到惊讶。

更新:我可以在 Firefox 72.0.2(64 位)中重现错误,但是如果你将它包装在一个async函数中,它的行为就不会那样了..

要了解更多信息: ECMAScript 提案:顶级等待

您可以等待字符串,因为它是允许的: block-await-expr-literal-string.js , AwaitExpression StringLiteral (在块中顶级等待的有效语法。)因此const x = await ''; 是有效的语法

(async () => {
    async function a() {
        return new Promise(resolve => {
            resolve('hello')
        })
    }

    const x = await a()

    x = 'something else'

})();

嗯,可能你错过了控制台调试器..

async function a() {
  return new Promise(resolve => {
    resolve('hello')
  })
}

const x = await a()

x = 'something else'
x = 'not assignable... in console or whatever..';

类型错误

执行暂停..

你不应该在同步函数中使用await关键字(你的 func 是全局范围)。 这没有意义。 我们正在使用await等待一些异步操作。 API 调用。

如果你删除await它通常会抛出一个错误。

首先,在学习这些东西时,请不要将浏览器控制台用作理想的编辑器环境。

其次,我刚刚检查了您在浏览器控制台中提到的内容。

如果您只是简单地复制并传递整个代码,它会按预期给出错误,说明无法重新分配常量。 正如@some 用户的回答中明确提到的那样。

但是,如果您逐行复制并粘贴它,它不会给您任何错误。

我不确定是什么原因,但您不能指望浏览器控制台为您提供 100% 编译器/验证环境。

所以除非是一些简单的表达式求值,否则最好使用一个好的开发环境,这样你就不会被意外的行为弄糊涂了。

如果你仍然需要在浏览器上运行的东西试试这个http://www.typescriptlang.org/play/

编辑:我在@Nicholas Tower 的回答上发现了这条评论,这似乎是这个问题的正确答案

“顶级await 提议仅适用于模块,它不会对devtools 控制台中的await 产生任何影响。– Bergi”

快乐编码!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM