2011-10-31 70 views
2

好吧,我知道什麼是FunctionDeclarationFunctionExpression之間的差異。 @CMS做了一個解釋的great job。直到最近,我以前用的是相同的語法創建lambda表達式命名空間以下Douglas Crockford's例如:的JSLint抱怨函數表達式語法命名空間

(function() { 
    "use strict"; 
}()); 

他所持該convention如下:

當一個功能就是要立即調用,整個調用表達式應該包裝在parens中,以便明確正在生成的值是函數的結果,而不是函數本身。

該語法非常適用於lambda表達式,因爲它們返回一個值。但是,名稱空間不返回值。因此,我現在更喜歡使用下面的語法命名空間,而不是(從JavaScript Garden拍攝):

(function() { 
    "use strict"; 
})(); 

使用這種語法是作爲背後的基本原理如下:

(// evaluate the function inside the paranthesis 
function() {} 
) // and return the function object 
() // call the result of the evaluation 

使用這種語法對於命名空間對我更有意義,因爲:此語法分隔了命名空間和調用;並且Douglas Crockford's語法期望該函數返回一個值。

但是,當我通過JSLint傳遞此語法時,出現錯誤,指出「Move the invocation into the parens that contain the function.」。我不明白爲什麼它會抱怨這個語法。這是一個廣泛使用和接受的語法。

我打算通知Douglas Crockford關於這個問題。但是,在我這樣做之前,我會感謝您提供的任何反饋。也許最好是堅持自己的語法?請解釋你的觀點。

+4

它抱怨的語法,因爲這是克羅克福德先生的意見,它應該。這就是JSLint的全部內容:機器人封裝了Crock對JavaScript編碼風格的看法。 – Pointy

+0

事實上,當JSLint強加給每個人的首選編碼風格時,這真的很煩人。我經常使用JSLint,並且很難看到我完美的語義良好的代碼生成錯誤。 –

+2

對於不想遵循Crockfords標準的人來說[jsHint](http://www.jshint.com),他不會去改變他們,因爲他花了很多時間來確定JavaScript的團隊開發的最佳實踐。 – JaredMcAteer

回答

1

回想起來,我認爲克羅克福德的觀點完全是教條。他說:

當一個函數被立即調用,整個調用表達式應該在括號包裹,這樣很明顯,正在生產值函數的結果,而不是本身的功能。

那麼我的論點是,當一個函數被立即調用時,它不清楚所產生的值是函數的結果而不是函數本身?試想一下:

所產生的值是函數:

var f = function() { 
    "use strict;" 
}; 

所產生的值是函數的結果:

var x = (function() { 
    "use strict;" 
})(); 

如果你想值是產生作爲功能本身,然後根本不使用parens。無論如何使用它們都沒有意義。

理解有許多程序員誰仍然將其分配給一個變量之前包裹在括號中的函數表達式,或者誰是一個虐待狂,做這樣的事情混淆道格:

var x = function() { 
    "use strict;" 
}(); 

但是有多難是否瞭解發生了什麼?也許在最後一個例子中,您需要向下滾動數百行代碼才能找到,但一個好的程序員會爲其他人省去麻煩,並將函數包裝在parens中;或者,如果他是一個吝嗇鬼:

var x = ~function() { 
    "use strict;" 
}(); 

身邊我也不會甚至懶得讀書人誰是在讓我罵他一意孤行編寫的代碼。回到這個問題,雖然我真的不喜歡Crockford的語法的原因是因爲他將函數和調用分組在單個圓括號中。對我來說,這是等同於以下情況:

var x = (f()); 

function f() { 
    "use strict;" 
} 

顯然包裝在括號的函數調用看起來有點傻,有點多餘,但是這就是我想象它是,它總是惹惱我,但每個人都以自己的方式。我個人認爲我的語法看起來更乾淨。

相關問題