在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ 為什么這個(gè)是暫時(shí)性死區(qū)呢?

為什么這個(gè)是暫時(shí)性死區(qū)呢?

function foo (x = y, y = 2) {
    return [x, y]
}
foo() // 報(bào)錯(cuò)

這里變量y沒(méi)有聲明, 但是應(yīng)該是變量未聲明報(bào)錯(cuò)啊, 怎么會(huì)是暫時(shí)性死區(qū)的原因呢?未聲明報(bào)錯(cuò)和暫時(shí)性死區(qū)的明確區(qū)別就是,暫時(shí)性死區(qū)使用了let或const命令, 并且是在塊級(jí)作用域中,這樣理解對(duì)嗎?

暫時(shí)性死區(qū)

ES6 明確規(guī)定, 如果塊級(jí)作用域中存在let和const命令, 則這個(gè)區(qū)塊中對(duì)這些命令聲明的變量從一開始就形成封閉作用域,
let命令聲明變量之前, 該變量都是不可用的, 這在語(yǔ)法上稱為暫時(shí)性死區(qū)

看到了一個(gè)一樣的問(wèn)題https://segmentfault.com/q/10...
但是babel轉(zhuǎn)換過(guò)后的js代碼也沒(méi)有使用let呀

回答
編輯回答
骨殘心

關(guān)于let提升,其實(shí)let也有提升,使用es6的參數(shù)初始化,參數(shù)的聲明都提升了,會(huì)提升的塊級(jí)作用域頂部,但是提升了卻沒(méi)有初始化,但是var變量提升會(huì)初始化為undefined,所以還可以使用,但是let沒(méi)有初始化,所以在【提前的聲明】到【聲明初始化】的地方就是暫時(shí)性死去,也就是不能在這區(qū)間使用這個(gè)提升的但沒(méi)有初始化let變量,

  1. 你說(shuō)的babel轉(zhuǎn)譯當(dāng)然是轉(zhuǎn)成es5啊,不會(huì)有l(wèi)et的,所以babel轉(zhuǎn)化運(yùn)行的話,應(yīng)該會(huì)提示是有聲明提前,x就是undefined

  2. 而不轉(zhuǎn)譯只是運(yùn)行的話,那么就是es6了,所以就是函數(shù)的作用域,參數(shù)會(huì)是作用域,就和let差不多了。

一旦設(shè)置了參數(shù)的默認(rèn)值,函數(shù)進(jìn)行聲明初始化時(shí),參數(shù)會(huì)形成一個(gè)單獨(dú)的作用域(context)。等到初始化結(jié)束,這個(gè)作用域就會(huì)消失。這種語(yǔ)法行為,在不設(shè)置參數(shù)默認(rèn)值時(shí),是不會(huì)出現(xiàn)的。

2018年9月2日 19:54
編輯回答
尛曖昧

意思就是函數(shù)參數(shù)也是使用let聲明的,你沒(méi)有傳參,函數(shù)使用了參數(shù)的默認(rèn)值,將y賦值給x,但是y還沒(méi)定義,所以不能使用,所以出現(xiàn)暫時(shí)性死區(qū)。

let x=y;
let y=2;
2018年7月24日 01:45