簡體   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