2010-07-20 56 views
1

在編寫javascript時,可以用3種不同的方式定義一個方法。最有效的javascript方法聲明

1]在全局命名空間的函數

function doSomething(); 

2] A函數是一個函數

function Clazz() {} 
Clazz.doSomething = function(){}; 

] 3所述的函數是的函數實例的memeber的構件

function Clazz() {} 
Clazz.prototype.doSomething = function(){}; 

根據代碼組織,可以選擇上述其中一種方法。

但純粹從性能的角度來看哪個是最有效率的? (特別是1和2之間)

如果doSomething有論點,您的答案會不同嗎?

+1

您也可以使用[模塊模式](http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth) – sje397 2010-07-20 07:46:51

+1

在我看來,這不需要成爲維基,除非是你的偏好。 – JAL 2010-07-20 07:48:58

+0

我不知道,勾選「社區wiki」框的標準是什麼。我認爲最好勾選它,以便其他人可以修改問題中的任何不準確之處。如果有任何指導方針,我很想知道。謝謝。 – Jayesh 2010-07-20 11:43:52

回答

2

從純粹的性能POV來看,1應該是最快的。原因是它需要較少的工作來設置範圍鏈執行上下文。此外,如果您從函數內部訪問任何全局變量,分辨率將以1爲最快,這僅僅是因爲範圍鏈的深度。 作爲一般原則,進一步向上(接近全球)範圍內的對象速度越快。出於同樣的原因,訪問屬性a.b會比訪問a.b.c更快速,但是如果說簡單的函數調用,性能增益可能不會太高,但是如果說你調用函數n循環,性能增益可能不會太高。

+0

這不完全正確。全局範圍比本地範圍慢。 – bluesmoon 2010-07-21 06:48:58

1

這些聲明都沒有做同樣的事情,也不可互換,你期望什麼樣的比較?這就像是詢問是否更快地實例化10個變量或具有10個項目的數組:一個是最快的,但結果不一樣。

0

你不能比較的函數聲明之間的性能,

例如加(A,B)中的所有3個地方宣稱功能給予同樣的性能。性能很重要,你的代碼如何編寫,而不是你聲明你的函數的地方......

+0

範圍鏈確實重要 – Lauri 2010-07-20 09:00:53

0

你缺少最優化的一個:

var x = function(){} 

JavaScript時看到的定義:

function x(){} 

它然後將其轉換爲前者的形式。如果你首先這樣做,那麼速度可以忽略不計。但爲了回答你的問題,這是最優的。

+0

除非您聲明數百萬個函數,否則它是否與現代瀏覽器有所不同? – tstenner 2011-05-25 11:48:45

+0

沒有你會注意到的。希望答案很有用:-) – 2011-06-11 13:05:45