牛奶老哥哥
2017-05-26 11:20:35
為什么var?x?=?1;
function?foo(x?=?x)?{
??//?...
}
foo()?//x?is?not?defined會報錯,而var?x?=?1;
function?f(y?=?x)?{
??console.log(y);
}
f() //1就能得出結(jié)果1呢
2 回答
已采納

小郎Lie
TA貢獻2條經(jīng)驗 獲得超0個贊
在JS初始化變量階段,有以下的順序
1:初始化函數(shù)參數(shù)
2:初始化函數(shù),如果有沖突,會覆蓋
3:初始化變量,如果有沖突,忽略
因此,你第一段代碼在初始化時的順序是:
1.初始化參數(shù)x=undefined,2.初始化函數(shù)foo,指向函數(shù)foo的執(zhí)行上下文,3.初始化變量x,但是此時有沖突,因此忽略,x仍然為undefined
因此第一段代碼執(zhí)行時會報x為undefined
第二段代碼的初始化順序是
1.初始化參數(shù)y=undefined,2.初始化函數(shù)foo,指向函數(shù)foo的執(zhí)行上下文,3.初始化變量x=undefined
執(zhí)行代碼時,會將x=1賦值給y,因此返回1
詳情參考"Javascript深入淺出"第7章7-3,聽一遍會聽不懂,多聽幾遍就好了

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