在Javascript中,我已經看到了三種不同的方式來定義函數。JavaScript函數聲明風格
- 傳統風格:
function foo() { //do something }
- 新的js忍者風格
var foo = function(){ //do something }
- DOM特定樣式
window.foo = function(){ //do something }
是什麼問題,
是什麼上述三者的區別?爲什麼我應該使用哪一個&?
在Javascript中,我已經看到了三種不同的方式來定義函數。JavaScript函數聲明風格
function foo() { //do something }
var foo = function(){ //do something }
window.foo = function(){ //do something }
是什麼問題,
是什麼上述三者的區別?爲什麼我應該使用哪一個&?
第一個是函數聲明。它被懸掛起來(你可以在當前範圍內的任何地方使用它)。
第二個是使用匿名函數的變量定義。變量懸掛,任務保持原位。該功能可能無法使用,直到您分配它的行。
第三個是分配一個全局方法。與第二個類似,雖然與全局對象一起工作,但這並不好。
然而,你能想到的第四種方法(稱爲函數表達式):
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有用的更詳細的文章。
它的「懸掛」是什麼意思?此外,我聲明使用2nd Approch有什麼不利之處。因爲從我對JavaScript的理解有限,一切都是一個對象 - 變量,函數。 – CuriousMind
你可以參考我提到的文章瞭解更多細節。簡而言之,所有變量和函數聲明都在內部被提升(提升)到當前範圍的開始。首先是函數,然後是變量。作業留在原地。 – Li0liQ
優秀的文章+文章是偉大的。 –
首先,請參閱Javascript: var functionName = function() {} vs function functionName() {}。
然後我們找到var foo =
和window.foo =
之間的差異。
第一個是一個局部範圍的變量,它非常可愛(除非它在全局範圍內完成)。其次是一個明確的全局,它具有全局的所有常見問題(例如與其他代碼衝突的可能性)。
如果我想聲明一個全局函數 - 這兩個沒有什麼區別? – CuriousMind
通常你應該避免在全球範圍內做任何事.. @ Gaurish。 –
可能重複[Javascript:var functionName = function(){} vs function functionName(){}](http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function- functionname)。 –
也var foo =功能foo(){//做點什麼} –