2 回答

TA貢獻(xiàn)2條經(jīng)驗(yàn) 獲得超0個(gè)贊
在JS初始化變量階段,有以下的順序
1:初始化函數(shù)參數(shù)
2:初始化函數(shù),如果有沖突,會(huì)覆蓋
3:初始化變量,如果有沖突,忽略
因此,你第一段代碼在初始化時(shí)的順序是:
1.初始化參數(shù)x=undefined,2.初始化函數(shù)foo,指向函數(shù)foo的執(zhí)行上下文,3.初始化變量x,但是此時(shí)有沖突,因此忽略,x仍然為undefined
因此第一段代碼執(zhí)行時(shí)會(huì)報(bào)x為undefined
第二段代碼的初始化順序是
1.初始化參數(shù)y=undefined,2.初始化函數(shù)foo,指向函數(shù)foo的執(zhí)行上下文,3.初始化變量x=undefined
執(zhí)行代碼時(shí),會(huì)將x=1賦值給y,因此返回1
詳情參考"Javascript深入淺出"第7章7-3,聽(tīng)一遍會(huì)聽(tīng)不懂,多聽(tīng)?zhēng)妆榫秃昧?/p>

TA貢獻(xiàn)1123條經(jīng)驗(yàn) 獲得超629個(gè)贊
既然是es6,你會(huì)發(fā)現(xiàn),如果你用let x=1,即使你后面是function foo(x=1)也會(huì)報(bào)錯(cuò)。
以后注意不要寫(xiě)這種容易沖突的代碼就行了
添加回答
舉報(bào)