// 整个underscore的实现包在一个立即执行函数中,避免污染全局对象 // 通过call(this)来入全局变量 (function() { // 缓存this var root = this; // 保存原始的“_”变量 var previousUnderscore = root._; // Array,Object,Function这些都是函数,通过局部变量保存原型属性prototype也是为了方便压缩 var ArrayProto = Array.prototype, ObjProto = Object.prototype; var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; // 通过局部变量创建prototypes的快速索引,减少原型链查找 var push = ArrayProto.push, slice = ArrayProto.slice, toString = ObjProto.toString, hasOwnProperty = ObjProto.hasOwnProperty; // 所有希望用到的ECMAScript 5原生的函数,在原生判断函数不存在的情况下,后面会进行重写 var nativeIsArray = Array.isArray, nativeKeys = Object.keys, nativeCreate = Object.create; // 创建一个Ctor局部变量,避免后面每次创建function F(){}这个匿名函数 var Ctor = function(){}; // 定义`_`函数对象,用来生产`_`实例对象 var _ = function(obj) { if (obj instanceof _) return obj; if (!(this instanceof _)) return new _(obj); this._wrapped = obj; }; if (typeof exports != 'undefined' && !exports.nodeType) { if (typeof module != 'undefined' && !module.nodeType && module.exports) { exports = module.exports = _; } exports._ = _; } else { root._ = _; } // 版本号 _.VERSION = '1.8.3'; // 各种内部函数 // ...... // 各种公开的静态函数,例如:Collection Functions,Array Functions,Function (ahem) Functions等等 // ...... // 实例方法和属性 _.prototype.value = function() { return this._wrapped; }; // Provide unwrapping proxy for some methods used in engine operations // such as arithmetic and JSON stringification. _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; _.prototype.toString = function() { return String(this._wrapped); }; // 支持AMD if (typeof define == 'function' && define.amd) { define('underscore', [], function() { return _; }); } }.call(this));