2011-09-21 31 views
3

我一直用來寫這樣的函數原型聲明:這些寫函數原型的方法是否相當?

var O = function() {}; 
O.prototype.fn = function() {} 

但這種方式的一些開發人員編寫:

var O = function() {}; 
O.prototype.fn = function fn() {} 

是等價的這些方法是什麼?如果不是,使用第二種方式有什麼優勢?

var O = function() {}; 
O.prototype.fn = function fn() {} 

回答

4

var a = function _a() { }

VS

var a = function() { }

前者稱爲命名函數表達式,

後者僅僅是一個功能分配。

甲NFE有兩個優點

  • 它具有在堆棧跟蹤示出一個名稱。這提高了調試顯著
  • 它可以在函數中使用遞歸
  • 名稱

一個NFE有缺點。 Kangax talks about them in depth

就我個人而言,我使用NFE無處不在,並忽略IE使內存泄漏。但是,由於IE將這些函數名稱泄漏到全局範圍內,因此應該努力使其具有唯一性。

因爲IE有把這些名字泄漏到全局範圍的習慣,所以我試着讓它們獨一無二。

這就是爲什麼我在前面加上函數聲明的名稱與_

var doSomeLogic = function _doSomeLogic() { 

}; 

作爲一個側面說明有一個替代模式

var O = function() {}; 
O.prototype.fn = function fn() {} 

var obj = new O(); 

這是

// prototype object 
var O = { 
    fn: function _fn() { } 
}; 
// factory 
var o = function _o() { return Object.create(O); } 

var obj = o(); 
+1

「我在任何地方都使用NFE並忽略這些錯誤」,「IE有一個將這些名字泄漏到全局範圍的習慣,我試圖讓它們變得唯一」 - 這是一個一致的邏輯? – katspaugh

+0

@katspaugh通過「忽略錯誤」我的意思是我不在乎IE泄漏內存。避免NFE的主要原因是內存泄漏。如果你真的關心IE,你會寫'var a = function _a(){};嘗試{刪除_a; } catch(e){/ *我討厭IE * /}'。你的正確,但我已經重新澄清我的意思 – Raynos

+0

是的,我現在看到。通過手動發明獨特名稱來解決名稱衝突與不關心內存泄漏相當。好。 – katspaugh

0

如果當您創建一個匿名函數中使用的名稱,你可以使用該名稱在函數內部:

var x = function y() { 
    y(); // here it exists 
} 

y(); // here it doesn't exist 

的,使用當然是有限的。您可以將其用於遞歸,或者如果將該方法掛鉤爲回調函數。

+0

'//這裏它不存在「僅在兼容的瀏覽器中有效。 IE有一個習慣,把'y'漏入全球範圍 – Raynos