2014-09-10 20 views
0

拿這一個的例子:爲何以及何時將函數定義在JavaScript中被解釋爲聲明

var is_android = true; 
if (is_android) { 
    function foo() { 
     alert('I am Android'); 
    } 
} else { 
    function foo() { 
     alert('I am NOT Android'); 
    } 
} 
foo(); 

它會被解釋爲

function foo() { 
    alert('I am Android'); 
} 
function foo() { 
    alert('I am NOT Android'); 
} 
var is_android; 

is_android = true; 
if (is_android) { 

} else { 

} 
foo(); 

它會提醒「我不是Android的」 ;看起來第二個foo定義覆蓋了第一個。

它將函數定義當作聲明處理,我的問題是,何時會發生這種情況?如何讓JavaScript把某些東西當作一個函數定義來處理?

謝謝。

+0

您所遇到的是通俗的稱爲「提升」。看看這裏:http://www.adequatelygood.com/JavaScript-Scoping-and-Histing.html – Waxen 2014-09-10 19:29:27

+0

在你的第一個例子中,你沒有任何有效的函數聲明。他們會發生什麼取決於你的JavaScript引擎。嘗試''使用嚴格的'',它會拋出。 – Bergi 2014-09-10 19:32:47

回答

4

函數聲明總是被提升到包含範圍的頂部。如果您希望它是有條件的,您應該使用一項作業:

var is_android = true; 
var foo; 
if (is_android) { 
    foo = function() { 
     alert('I am Android'); 
    } 
} else { 
    foo = function() { 
     alert('I am NOT Android'); 
    } 
} 
foo(); 
+0

bahh我只是打字!好工作 – Jay 2014-09-10 19:31:44

+0

再次感謝! @Barmar – 2014-09-10 19:38:27

相關問題