模块针对浏览器和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 = {}; } // ... })(); 

这是实现这个目标的最好方法吗?

“最好”? 那么,这是一个主观的事情; 这当然是一个好方法。

你遗漏的一点是非常重要的,就是函数应该把this作为全局上下文的引用 – 浏览器的目标代码是“window”:

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

这样,代码可以“导出”符号:

  global.Foo = someFunction; 

另一个类似的技巧是做到这一点:

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

这有几乎相同的效果。

使用ECMAScript 5严格模式(以及未来版本的JavaScript),只有Pointy的版本可以工作,因为“this”不再指向非方法函数中的全局对象。 代替:

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