2016-07-24 43 views
0

在本例中,我知道它將打印undefinedJavascript:函數提升

var bar = typeof foo; 
var foo = function() { 
    console.log('abcd'); 
} 
foo(); 
console.log(bar); // -> undefined 

所以我的理解是,當變量懸掛,bar仍高於foo,但foo得到執行,所以不應該解釋知道什麼foo是什麼?

注:我試圖瞭解解釋器是如何工作的。我的問題不在於如何解決上述問題。

+3

當'bar'被賦予'typeof foo'的值時'foo'沒有被執行。在提升時,'foo'的值是未定義的。 –

+0

通常,最好忘記吊裝存在。只有知道你的函數是否妨礙了可讀性,並且你想最後聲明它們,但是你必須使用一個命名的函數表達式來聲明它們纔是真正有用的。 – 4castle

回答

5

如果你佔了變量定義提升,你的代碼是相同的:

var bar; 
var foo; 

// foo does not yet have a value, so it it's still undefined 
bar = typeof foo; 

// foo gets a value here 
foo = function() { 
    console.log('abcd'); 
} 

// since foo got a value in the previous statement, you can now execute it here 
foo(); 
console.log(bar); 

只有變量定義本身懸掛,而不是分配。

所以,你可以從這個排序看到,當你執行bar = typeof foofoo還沒有一個值,從而分配給undefinedbar。如


功能定義:

function foo() { 
    console.log('abcd'); 
} 

也懸掛,所以如果你定義foo這樣,那麼這將是一個不同的故事。但是您使用的功能分配本身並不是本身。您定義foo的方式,它只是一個像任何其他變量一樣的變量。

+0

但是,正如你所說的,foo得到的是第二個變量賦值的值,在最後一行調用'bar'時,解釋器不應該知道foo是什麼嗎? – AlanH

+1

@AlanH - 「bar」包含任何「foo」在作業時的副本。您可以將'foo'改爲您的心臟內容,'bar'不會改變。這就像'var y = 1; var x = y; y = 2;''x'的值不會因爲你賦值給'y'而改變。 'x'具有原來在'y'中的任何副本。 – jfriend00

+0

@AlanH - 從當天早些時候看到這個答案:http://stackoverflow.com/questions/38538330/when-command-line-order-matters/38538444#38538444 – jfriend00