2014-02-18 24 views
0

我在某些模塊中看到它們使用modules.exports.something =()->exports.something =()->出口與此差額

並且在其他一些時間用this.something =()->完成。

顯然導致相同的行爲。這個比那個好嗎? this是指exports對象或類似的東西?

回答

2

exportsmodule.exports通常存在於提供某種模塊加載系統的環境中。例如Node.js使用CommmonJS模塊系統。 RequireJS提供了一個AMD風格的系統。在瀏覽器中加載的網頁不會額外載入某種模塊系統(如RequieJS),因此將不會定義exportsmodule.exports。如果手邊有一個模塊系統並且想要導出值,通常情況下,您會將要導出的內容分配給exportsmodule.exports或這些對象上的字段。

this指的是高度依賴於上下文。如果您創建的文件只有console.log(this)並使用Node.js運行它,則會看到{}輸出到控制檯。如果您在Chrome中加載的空白HTML頁面中嘗試使用相同的內容,則會看到thiswindow對象。因此,在瀏覽器中,在最外面的範圍內分配this.foo相當於分配給window.foo,並且是在全局空間中聲明foo的一種方式。您有時會看到的代碼旨在適用於各種環境,這些環境將根據運行的位置更改this的值。喜歡的東西:

function factory() { 
    this.foo = function() {...}; 
    this.bar = "q"; 
} 

if (typeof exports !== 'undefined') 
    factory.call(exports); // CommonJS or AMD environment. 
else if (typeof window !== 'undefined') 
    factory.call(window); // Browser. 
else 
    factory.call(this); // Something else. 

使用call方法上類似上面的factory函數設置的this內部factory傳遞給call所述第一參數的值。