成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

ReferenceError: Cannot access 'X' before

Elle / 5219人閱讀

摘要:中文文檔中的變量提升,是指在聲明變量的代碼執(zhí)行之前,可以進(jìn)行初始化和使用而不是指在創(chuàng)建詞法環(huán)境階段是否會(huì)創(chuàng)建對(duì)應(yīng)的標(biāo)識(shí)符。

問(wèn)題背景

今天在 chrome devtools 中運(yùn)行以下代碼:

function fn (name){
  if (typeof name === "undefined"){
     console.log("name:", name)
     let name = "lily"
  }
}
fn()

原以為可以正常 work,實(shí)際報(bào)錯(cuò):

ReferenceError: Cannot access "name" before initialization
尋找答案

閱讀 mdn let 文檔,找到以下說(shuō)明:

在 ECMAScript 2015 中,let 綁定不受變量提升的約束,這意味著 let  聲明不會(huì)被提升到當(dāng)前執(zhí)行上下文的頂部。在塊中的變量初始化之前,引用它將會(huì)導(dǎo)致 ReferenceError(而使用 var 聲明變量則恰恰相反,該變量的值是 undefined )。這個(gè)變量處于從塊開(kāi)始到 let 初始化處理的”暫存死區(qū)“之中。

看完上面的說(shuō)明,我一臉懵逼。因?yàn)橐韵麓a可以正常運(yùn)行:

function fn (name){
  if (typeof name === "undefined"){
     console.log("name:", name)
     // let name = "lily"
  }
}
fn() // name: undefined

也就是說(shuō),被注釋掉的第四行代碼對(duì)第三行是產(chǎn)生的影響的,既然 let 聲明不會(huì)被提升,那第四行代碼是怎么影響到第三行的?
思考這個(gè)問(wèn)題,我想到<>中第5章中有對(duì)創(chuàng)建詞法環(huán)境步驟的描述,在page112中,有如下說(shuō)法:

在塊級(jí)環(huán)境中,僅查找當(dāng)前塊中通過(guò) let 或 const 定義的變量。對(duì)于所查找到的變量。若該標(biāo)識(shí)符不存在,進(jìn)行注冊(cè)并將其初始化為undefined。若該標(biāo)識(shí)符已經(jīng)存在,將保留其值。

好嘛,我更懵逼了。這個(gè)意思是 let 聲明在塊作用域中會(huì)被提升吧?實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),在 chrome 中代碼測(cè)試下:

console.log("name:", name)
let name = "lily"

結(jié)果報(bào)錯(cuò):

ReferenceError: Cannot access "name" before initialization

這個(gè)實(shí)踐無(wú)法明確說(shuō)明 let 聲明是否會(huì)提升的問(wèn)題。我的唯一標(biāo)準(zhǔn)失效了。正當(dāng)我束手無(wú)策時(shí),突然考慮到翻譯過(guò)程的誤差,抱著試試看的心態(tài)查看了 mdn 文檔英文版,說(shuō)明如下:

let bindings are created at the top of the (block) scope containing the declaration, commonly referred to as "hoisting". Unlike variables declared with var, which will start with the value undefined, let variables are not initialized until their definition is evaluated. Accessing the variable before the initialization results in a ReferenceError. The variable is in a "temporal dead zone" from the start of the block until the initialization is processed.

這就很清晰了。原文說(shuō)的是:通過(guò) var 聲明的變量有初始值 undefined,而通過(guò) let 聲明的變量直到定義的代碼被執(zhí)行時(shí)才會(huì)初始化。在變量初始化前訪問(wèn)變量會(huì)導(dǎo)致 ReferenceError。

總結(jié)

在上面的文檔中,其實(shí)我一直誤解了中文 javascript 文檔中對(duì)變量提升的定義。
中文 javascript 文檔中的變量提升,是指:在聲明變量的代碼執(zhí)行之前,可以進(jìn)行初始化和使用;而不是指:在創(chuàng)建詞法環(huán)境階段是否會(huì)創(chuàng)建對(duì)應(yīng)的標(biāo)識(shí)符。
通過(guò) var 聲明的變量和 let 或 const 聲明的變量,在創(chuàng)建相應(yīng)作用域的詞法環(huán)境階段,都會(huì)注冊(cè)標(biāo)識(shí)符,但僅通過(guò) var 聲明的變量存在會(huì)變量提升,若在通過(guò) let 或 const 聲明了變量的(塊)作用域中,先使用再聲明該變量,就會(huì)拋出錯(cuò)誤:

ReferenceError: Cannot access "X" before initialization
補(bǔ)充

不要過(guò)度依賴(lài)翻譯后的文檔,已更新 mdn 上這部分的中文文檔。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/104262.html

相關(guān)文章

  • [譯]Understanding javascript&#039;s &#039;undefined

    摘要:一個(gè)表示編譯器檢測(cè)到一個(gè)無(wú)效的引用值。在實(shí)際情況中,往往是在獲取一個(gè)未被賦值的引用時(shí)被拋出。任何一個(gè)函數(shù)上下文都有一個(gè)被稱(chēng)為活動(dòng)對(duì)象的變量對(duì)象。沒(méi)有找到的話,就會(huì)認(rèn)為引用名沒(méi)有基礎(chǔ)值并拋出的錯(cuò)誤。下沒(méi)有下的屬性?xún)H存在于被啟動(dòng)的情況下。 和其他語(yǔ)言相比,javascript中的對(duì)于undefined的理解還是有點(diǎn)讓人困惑的。特別是試著理解ReferenceErrors錯(cuò)誤(x is no...

    galaxy_robot 評(píng)論0 收藏0
  • Useful APIs that you probably don&#039;t notice

    摘要:結(jié)果 Date Get the number of days in a month The 0th day of next month is the last day of the current month. function daysInMonth(year, month) { let date = new Date(year, month + 1, 0); ret...

    崔曉明 評(píng)論0 收藏0
  • local variable &#039;var1&#039; referenced before

    摘要:起初是群里一個(gè)哥們這句話報(bào)錯(cuò)。我竟然沒(méi)看懂代碼如下其實(shí)這個(gè)代碼不能很好的反應(yīng)問(wèn)題。來(lái)看以下兩個(gè)我一開(kāi)始沒(méi)理解這個(gè)問(wèn)題??吹胶痛致缘睦斫獬刹荒軌蛟陂]包函數(shù)中改變上層函數(shù)的變量。實(shí)際上是,如果一個(gè)變量被賦值,那么會(huì)認(rèn)為其為局部變量。 起初是群里一個(gè)哥們這句話報(bào)錯(cuò)。后來(lái)之前的一個(gè)實(shí)習(xí)生,給出了鏈接來(lái)解釋這個(gè)問(wèn)題。 我竟然沒(méi)看懂.... http://stackoverflow.com/que...

    Aklman 評(píng)論0 收藏0
  • antd報(bào)錯(cuò)Cannot read property &#039;filter&#039; of u

    摘要:技術(shù)棧問(wèn)題描述在狀態(tài)組件中書(shū)寫(xiě)下的其中涉及點(diǎn)擊某處出現(xiàn)彈框的操作,在中有選框,點(diǎn)擊取消或清空所有表單信息。點(diǎn)擊選框內(nèi)的各個(gè)選項(xiàng),報(bào)錯(cuò)。在點(diǎn)擊取消之后,清空的是所有組件的內(nèi)容,再打開(kāi)新的彈窗后,組件的狀態(tài)并沒(méi)有刷新。 技術(shù)棧: react + dva + antd 問(wèn)題描述: 在狀態(tài)組件中書(shū)寫(xiě)state下的columns,其中涉及點(diǎn)擊某處出現(xiàn)彈框modal的操作,在modal中有sel...

    Tychio 評(píng)論0 收藏0
  • webpack編譯報(bào)錯(cuò)Cannot find module &#039;@babel/core�

    摘要:編譯報(bào)錯(cuò)用了這個(gè)指令后報(bào)錯(cuò)嘗試重新下載了還是不行原來(lái)是被我更新了不支持原來(lái)的配置了,官方默認(rèn)對(duì)應(yīng)的版本需要一致即需要搭配最新版本兩種解決方案回退低版本更新到最高版本編譯無(wú)法識(shí)別語(yǔ)法需要安裝之后 ** webpack編譯報(bào)錯(cuò)Cannot find module @babel/core **~ npm install babel-core babel-loader --save-dev ...

    DandJ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<