2011-05-20 55 views
2

骨幹和下劃線在瀏覽器和nodejs中均可用。針對瀏覽器和nodejs模塊的模式

他們使用以下模式

(function(){ 
    // The top-level namespace. All public Backbone classes and modules will 
    // be attached to this. Exported for both CommonJS and the browser. 
    var Backbone; 
    if (typeof exports !== 'undefined') { 
    Backbone = exports; 
    } else { 
    Backbone = this.Backbone = {}; 
    } 

    // ... 
})(); 

這是實現這一目標的最佳途徑?

回答

2

「最佳」?那麼,這是一個主觀的事情;這當然是一個好方法。你離開了這是很重要的

東西是函數應該使用this作爲參考全球範圍內—會打電話針對瀏覽器的什麼碼「窗口」:

(function() { 
    var global = this; // like "window" 

這樣一來,有可能爲代碼爲 「出口」 標誌:

global.Foo = someFunction; 

另一個類似的技巧是這樣做:

(function(global) { 
    // ... 
})(this); 

這幾乎具有相同的效果。

+2

Err..OP已經在全局範圍內實例化一個var(通過引用'this')在例子的第8行:'Backbone = this.Backbone = {};' – 2011-05-20 15:38:11

+0

@Rob Raisch啊是的 - 在任何情況下,它都沒有像在Underscore源代碼中那樣明確地完成,例如。無論如何,我通常只需要提供一個肯定的答案,而不僅僅是「是」這個詞。 :-) – Pointy 2011-05-20 15:44:01

0

使用ECMAScript 5嚴格模式(以及未來版本的JavaScript),只有Pointy的版本可以工作,因爲「this」不會再指向非方法函數中的全局對象。取而代之的是:

(function() { 
    "use strict"; 
    console.log("This is "+this); // "This is undefined" 
}());