2010-07-13 56 views
4

可能重複:
Javascript: var functionName = function() {} vs function functionName() {}這兩種在JavaScript中定義函數的方式有什麼區別?

方法1:

function fancy_function(){ 
    // Fancy stuff happening here 
} 

方式2:

var fancy_function = function(){ 
    // Fancy stuff happening here, too. 
} 

我用的是前者,當我」我只是定義了一個「常規」函數,我將使用一次或多次,後者當我通過它回調另一個函數左右時,但它看起來在兩種方式都工作正常。

它在某種程度上真的有區別嗎?

+1

這裏已經有好幾次很好的回答了。只需搜索谷歌或stackoverflow。 – Anurag 2010-07-13 15:52:34

+2

http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname and http://stackoverflow.com/questions/1925976/declaring-functions-in-javascript-closed – Anurag 2010-07-13 16:00:11

+0

謝謝你,@Anurag。我已經選擇了一個關閉它的答案。我將來會更加謹慎。 – 2010-07-13 16:08:04

回答

2

函數本身沒有區別,但後者爲您提供了更大的靈活性,因爲您有對函數的引用,並且它在覆蓋之後的行爲方式上有所不同。

這可以讓你實現後者無法實現的行爲;如下面的技巧來「覆蓋」現有的功能,然後調用「基地」:

var myOriginalFunction = function() { 
    window.alert("original"); 
} 

var original = myOriginalFunction; 

var myOriginalFunction = function() { 
    window.alert("overridden"); 
original(); 
} 

myOriginalFunction(); 

這給你一個警告「重寫」,隨後警報「原始」。

但是,如果您嘗試使用前面的符號,您會發現卡住了警告「overidden」的永無止境的循環。

0

您可以根據情況使用,既可以成爲window對象的方法。後者被稱爲匿名函數。

2
  1. 函數定義
  2. 功能字面分配

唯一的區別是,你可以即時訪問前在某些情況下,而你必須等待對後者的分配。

不要在firebug控制檯/解釋器中運行它來測試它,而是測試一個真正的html頁面。

say('spotted'); 
function say(msg){ alert(msg) } 

以上的工作,但如果你定義的字面下面var say = function(){}一個函數,它會抱怨它尚未確定。

+0

不,這不是唯一的區別 - 我認爲羅布萊文的答案突出了一個重要的問題。 – 2010-07-13 16:15:17

0

功能,可在程序可供選擇,而不必被前面的代碼比他們被稱爲地方定義。我相信這叫做'提升'。

所以此工程

cow('spotted'); 
function cow(color){ return 'cow is '+color; } 

但是這將引發一個錯誤

cow('spotted');//cow isn't defined yet! 
var cow=function(color){ return 'cow is '+color; } 
2

在第一個樣品要定義一個名爲功能 - 該功能將始終由名稱來稱呼。使用相同的名稱定義不同的函數將是一個錯誤(除非直接指定給窗口屬性)。在第二個示例中,您正在定義一個匿名函數並將其指定爲變量的值。以後可以根據需要將變量的值更改爲任何其他功能;當然,除非你把它存儲在其他地方,否則會失去對該過程中匿名函數的引用。所以,在這兩種情況下你都沒有做同樣的事情,儘管如果你願意的話你可以這樣對待它 - 並且確保在第二種情況下使用函數之前定義該函數,儘管這更多的是變量函數而不是功能本身。

相關問題