2011-10-11 121 views
4

在Javascript中,我已經看到了三種不同的方式來定義函數。JavaScript函數聲明風格

  • 傳統風格:

function foo() { //do something }

  • 新的js忍者風格

var foo = function(){ //do something }

  • DOM特定樣式

window.foo = function(){ //do something }

是什麼問題,

是什麼上述三者的區別?爲什麼我應該使用哪一個&?

+0

可能重複[Javascript:var functionName = function(){} vs function functionName(){}](http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function- functionname)。 –

+0

也var foo =功能foo(){//做點什麼} –

回答

10

第一個是函數聲明。它被懸掛起來(你可以在當前範圍內的任何地方使用它)。

第二個是使用匿名函數的變量定義。變量懸掛,任務保持原位。該功能可能無法使用,直到您分配它的行。

第三個是分配一個全局方法。與第二個類似,雖然與全局對象一起工作,但這並不好。

然而,你能想到的第四種方法(稱爲函數表達式):

var foo = function bar(){ //do something } 

這裏,酒吧將只提供內部本身,這是遞歸有用,而不是與它攪動目前的範圍。

您正在根據您的需求選擇任何方法。我只會投票反對第二種方法,因爲它使函數的行爲像一個變量。

只要您提到第二個和第三個選項,我想提醒一下,污染性的全局對象是considered bad practice。您最好考慮使用自動執行的匿名函數來創建單獨的範圍,例如

(function(){ 
    var t = 42; // window.t still does not exist after that 
})(); 

我想你可能會發現在JavaScript Scoping and Hoisting有用的更詳細的文章。

+0

它的「懸掛」是什麼意思?此外,我聲明使用2nd Approch有什麼不利之處。因爲從我對JavaScript的理解有限,一切都是一個對象 - 變量,函數。 – CuriousMind

+0

你可以參考我提到的文章瞭解更多細節。簡而言之,所有變量和函數聲明都在內部被提升(提升)到當前範圍的開始。首先是函數,然後是變量。作業留在原地。 – Li0liQ

+0

優秀的文章+文章是偉大的。 –

2

首先,請參閱Javascript: var functionName = function() {} vs function functionName() {}

然後我們找到var foo =window.foo =之間的差異。

第一個是一個局部範圍的變量,它非常可愛(除非它在全局範圍內完成)。其次是一個明確的全局,它具有全局的所有常見問題(例如與其他代碼衝突的可能性)。

+0

如果我想聲明一個全局函數 - 這兩個沒有什麼區別? – CuriousMind

+1

通常你應該避免在全球範圍內做任何事.. @ Gaurish。 –