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