10 回答

TA貢獻1871條經驗 獲得超13個贊
function f(params){
var x;
if(params){
x = 10; //var x=10; 變量提升到最頂層
}
return x;
}
f(false);//undefined
非常感謝熱心小伙伴的指點, 樓上說的變量提升就是這個意思吧 這應該就是程序走的步驟

TA貢獻1850條經驗 獲得超11個贊
這是作用域的問題。
用了var關鍵字,變量作用域提升,true的時候,if外面可見x,false的時候不走這里,外面看不到。
你可以試下let或者const,即使你true,直接報錯x沒定義。

TA貢獻1871條經驗 獲得超8個贊
這個問題,var是函數作用域也就是function級別。{}限制不了它的域,存在變量提示。
也就是js解釋器在解釋的時候第一遍會遍歷function里的變量做預聲明,然后再按行解析。
這道題,程序進入函數后:
先聲明x,但是不賦值,為undefined
然后解析if,發(fā)現(xiàn)為false,那么var x = 10; 這句不執(zhí)行,直接執(zhí)行 return x。然后就是undefined
你可以對比下面兩段代碼
function f(shouldInitialize = true) {
console.log(x);
if (shouldInitialize) {
var x = 10;
}
return x;
}
f(false); // returns 'undefined'
function f(shouldInitialize = true) {
console.log(x);
if (shouldInitialize) {
let x = 10;
}
return x;
}
f(false); // let 作用域是塊也就是{},解析階段會報錯

TA貢獻1795條經驗 獲得超7個贊
該說的樓上都說了,我只是翻譯一下。
function f(shouldInitialize: boolean) {
var x;//這就是所謂的聲明提升
if (shouldInitialize) {
x = 10;
}
return x;
}
f(true); // returns '10'
f(false); // returns 'undefined'

TA貢獻1848條經驗 獲得超2個贊
(1)傳入參數為true時,if語句執(zhí)行,存在變量提升情況。此時,f()函數如下。
function f(shouldInitialize: boolean) {
var x; //變量提升
if (shouldInitialize) {
x = 10;
}
return x;
}
f(true); // returns '10'
(2)傳入參數為false時,if語句對應的賦值語句沒有執(zhí)行,但依舊存在var變量聲明和變量提升。此時,f()函數如下。
//傳入參數為false時
function f(shouldInitialize: boolean) {
var x; //變量提升
return x;
}
f(false); // returns 'undefined'

TA貢獻1780條經驗 獲得超1個贊
添加回答
舉報