2011-12-09 32 views
1

這是爲什麼,當我返回一個功能,我不能有更多的代碼在它下面return語句的JavaScript

樣品

<script language="javascript"> 
    return compute(); 
    alert(1); 
</script> 

警報將不工作

+4

因爲'return'只能在函數上下文中使用。 –

回答

3

警報將不工作

聽起來很對我。我想這個代碼爲:

(function() { 
     return compute(); 
     alert(1); 
    })(); 
+0

你不想翻轉這兩行嗎?我相信,作爲第一線的迴歸將阻止'alert(1)'發生。 – jefflunt

+0

@normalocity是的,但這不是問題的意圖。我只是想確認警報不起作用。明白了, –

+0

啊。 – jefflunt

2

return聲明的功能是雙重的。首先,它返回一個值(在這種情況下是一個指向函數的指針)。其次,它將管理control flow,也就是說,它告訴瀏覽器正在執行該代碼以離開該函數,並將執行控制返回給調用示例腳本的代碼片段。

換個說法,試圖返回一個值,同時也期望繼續執行,這使瀏覽器接下來要做的事情變得模糊不清。

如果您要翻轉兩行(首先警告,THEN返回值),則會導致兩行執行。

This tutorial也可能提供進一步的見解。

而且,Rob WKris Krause注意,你只能從return的功能,但還有你的代碼不裹的功能。

+0

小改正:在這種情況下(我假設OP的例子)返回值是'compute()'返回的值,不一定是函數。 'return compute;'會返回'compute()'函數。 – JJJ

0

函數/閉包內部,你可以在可以在你的return語句下面有代碼。具體來說,函數聲明將被提升,以便它們可以被返回之上的代碼使用。我一直使用這個「模式」,這裏是我當前代碼庫的一個小例子:

function msgHandlers() { 
    var scope 
     ,msgs; 

    return { 
     SET_CONTEXT: function(context) { 
      scope = context.scope; 
      msgs = context.messages; 
     } 

     ,SUBSCRIBE_ALL: function() { 
      me.subscribe(scope, msgs.ITEM_PINNED, itemPinnedHandler); 
     } 
    } 

    function itemPinnedHandler(record) { 
     loadInventoryRecord(record);  
    } 
}