2014-12-03 44 views
3

if語句裏面javascript函數的處理是什麼? js是不是這樣做?下面的代碼在瀏覽器中運行時效果很好。它會在兩秒後提醒「嘿」。Javascript函數在if語句內部掛起

<script> 
setTimeout(hey,2000) 
function hey(){ 
    alert('hey') 
} 
</script> 

但添加繁瑣if聲明解決此:

<script> 
if(true){ 
setTimeout(hey,2000) 

function hey(){ 
    alert('hey') 
} 
} 
</script> 

,突然就抱怨說,hey is not defined
現在,如果你改變了回調從heyfunction(){hey()},像這樣:

<script> 
if(true){ 
setTimeout(function(){hey()},2000) 

function hey(){ 
    alert('hey') 
} 
} 
</script> 

然後開始再次合作,甚至與if語句。發生什麼了?

+4

我[無法重現](http://jsfiddle.net/7omodL3z/)您描述的問題。 – Quentin 2014-12-03 20:56:41

+1

http://jsfiddle.net/r1oc1joh/ JFiddle接受它。 – jackncoke 2014-12-03 20:58:04

+0

我正在使用firefox。您可以直接將該代碼剪切並粘貼到文件中,而無需使用任何其他代碼,並且它發生在我身上。 – 2014-12-03 20:58:25

回答

4

Firefox doesn’t hoist function declarations in blocks,顯然。你看到的行爲是Firefox所特有的,並且在別處幾乎完全相同。

套用:

作品:

if (hasRequiredJQueryVersion) { 
    // Test data here 
    // Library code here 
} 

作品無處不除了火狐:

if (true) { 
    testFunction(); 
    function testFunction() { 
     alert(‘testFunction called’); 
    } 
} 

這是行爲,你應該避免,因爲它是特定的Firefox,即使Firefox的行爲在技​​術上可能是正確的。

+0

噢,我開始覺得我瘋狂與其他人說他們不能重現問題。有趣的是,人們提供的jsFiddles仍然在Firefox上工作。爲什麼它會在jsFiddle中工作,但不能工作? – 2014-12-03 21:11:15

+0

@ J-bob JSFiddles *不會在Firefox中爲我工作。除了(我上面評論過)的rfornal之外,其中沒有一個是因爲錯誤地重現了問題而被破壞的。 – meagar 2014-12-03 21:13:42

+0

啊是的,我(愚蠢)沒有意識到rfornal的jsfiddle不會因爲他們如何粘貼兩個exapmles而暴露出問題。 – 2014-12-03 21:18:45

-2

第三個例子與第二個例子一致:setTimeout實際上並沒有調用hey,所以不關心它沒有被定義。只有在發生超時時纔會調用hey,此時已經定義了

+0

您不必稱呼它; 'setTimeout'實際上分散了Firefox的行爲被打破的真正問題(或者至少與其他瀏覽器不同)。這不是提升功能。 – meagar 2014-12-03 21:07:06

+0

OP給出了一個例子,即使函數沒有被掛起(如第二個例子所證明),這個函數在第三個函數中工作。我只是試圖解釋看似矛盾。敲它不是一個完整的答案,但它解決了部分問題(其中指出「真正的問題」沒有解決)。 – 2014-12-03 21:20:17