1 (function () { 2 // Establish the root object, `window` in the browser, or `global` on the server. 3 var root = this; 4 var _ = function (obj) { 5 return new wrapper(obj); 6 }; 7 if (typeof exports !== ‘undefined‘) { 8 if (typeof module !== ‘undefined‘ && module.exports) { 9 exports = module.exports = _; 10 } 11 exports._ = _; 12 } 13 else if (typeof define === ‘function‘ && define.amd) { 14 // Register as a named module with AMD. 15 define(‘underscore‘, function () { 16 return _; 17 }); 18 } 19 else { 20 root[‘_‘] = _; 21 } 22 }).call(this);
首先,它通过function定义构建了一个闭包,将this作为上下文对象直接call调用,以避免内部变量污染到全局作用域。续而通过判断exports是否存在来决定将局部变量_绑定给exports,并且根据define变量是否存在,作为处理在实现了AMD规范环境下的使用案例。仅只当处于浏览器的 环境中的时候,this指向的是全局对象(window对象),才将_变量赋在全局对象上,作为一个全局对象的方法导出,以供外部调用。
if (typeof exports !== "undefined") { exports.EventProxy = EventProxy; } else { this.EventProxy = EventProxy; }
即,如果exports对象存在,则将局部变量挂载在exports对象上,如果不存在,则挂载在全局对象上。
Node.js入门:前后端模块的异同,布布扣,bubuko.com
原文:http://www.cnblogs.com/liusuqi/p/3735433.html