鍍金池/ 問答/HTML/ js 局部變量和全局變量

js 局部變量和全局變量

function f(shouldInitialize: boolean) {
    if (shouldInitialize) {
        var x = 10;
    }

    return x;
}

f(true);  // returns '10'
f(false); // returns 'undefined'

此處的 x雖然在if語句中 但是也是在f函數(shù)中作為局部變量 為什么 false返回的是undefined呢 ?不是應該也返回10嗎

回答
編輯回答
離夢

你的第一個問題:返回的是undefined呢?看到問題第一反應是用變量提升來幫你解答,但是看到第二個問題,你竟然問:不是應該也返回10嗎?突然猶豫要不要解答第一個問題了。

2017年11月15日 12:32
編輯回答
乖乖瀦

你這個幸好是var命中了js的awful parts
如果你試試const let,會直接報ReferenceError。

2017年11月11日 11:00
編輯回答
尐飯團

兄弟你哪個實參如果接收了false的話說明false為0 就不會走if語句內(nèi)的結構了 返回的結果自然就是undefined了

2018年1月3日 22:47
編輯回答
朽鹿

變量提升,盡量少用var,用let就明白咋回事了

2017年3月11日 13:09
編輯回答
短嘆

變量提升,盡量把變量定義在代碼塊最前面

2017年6月29日 03:50
編輯回答
抱緊我

因為x沒定義啊
false等同于

function f(shouldInitialize: boolean) {
    return x;
}
2017年10月26日 09:36
編輯回答
空痕

瀉藥,這個問題,var是函數(shù)作用域也就是function級別。{}限制不了它的域,存在變量提示。
也就是js解釋器在解釋的時候第一遍會遍歷function里的變量做預聲明,然后再按行解析。
這道題,程序進入函數(shù)后:

  1. 先聲明x,但是不賦值,為undefined
  2. 然后解析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 作用域是塊也就是{},解析階段會報錯
2017年1月28日 10:32
編輯回答
怪痞

該說的樓上都說了,我只是翻譯一下。

function f(shouldInitialize: boolean) {
    var x;//這就是所謂的聲明提升
    if (shouldInitialize) {
        x = 10;
    }

    return x;
}

f(true);  // returns '10'
f(false); // returns 'undefined'
2017年9月13日 02:17
編輯回答
薄荷綠

這是作用域的問題。
用了var關鍵字,變量作用域提升,true的時候,if外面可見x,false的時候不走這里,外面看不到。

你可以試下let或者const,即使你true,直接報錯x沒定義。

2017年3月27日 02:29
編輯回答
伴謊

(1)傳入?yún)?shù)為true時,if語句執(zhí)行,存在變量提升情況。此時,f()函數(shù)如下。

function f(shouldInitialize: boolean) {
    var x;  //變量提升
    if (shouldInitialize) {
       x = 10;
    }
    return x;
}

f(true);  // returns '10'

(2)傳入?yún)?shù)為false時,if語句對應的賦值語句沒有執(zhí)行,但依舊存在var變量聲明和變量提升。此時,f()函數(shù)如下。

//傳入?yún)?shù)為false時
function f(shouldInitialize: boolean) {
    var x;  //變量提升
    return x;
}

f(false);  // returns 'undefined'
2017年7月29日 21:42