underscore源码学习1
更新日期:
文章目录
期末事情特别多,7月份才考完放假。都没办法静下心来好好写代码,五月份学习backbone,接触到了underscore,发现源码特别少,1000多行代码。但提供了好多好用的工具方法。
以前看过jQuery,但是无奈水平有限,看不懂,看完也忘记了。underscore(俗称底线库)真是大赞,文档注释都很详细,关键每个工具方法就十来行作用,很容易阅读。真是蛮适合学习的。
我现在阅读的版本是:1.8.3
- 匿名模块
把代码都放在一个匿名自执行模块里面,这样做的好处是,防止变量污染,命名冲突等等各种问题,
而且最后只暴露出 _
对象供外部使用。
//显式指定上下文
(function(
// do something
).call(this));
//关于自执行: 就是把一个函数转成函数表达式。
//example 1:
(function(){
//do something
})();
//example 2:
(function(){}());
//example 3:
~function(){}();
- 创建模块全局变量
新建一些变量,供后续使用。减少原形链的查找,增强代码执行性能。
//创建根对象
var root = this;
//保存之前的页面存在的 _
var previousUnderscore = root._;
//常见原型的引用保存
var ArrayProto = Array.prototype,
ObjProto = Object.prototype,
FuncProto = Function.prototype;
//核心方法的引用保存
var push = ArrayProto.push,
slice = ArrayProto.slice,
toString = ObjProto.toString,
hasOwnProperty = ObjProto.hasOwnProperty;
//ES5中的方法
var nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
nativeBind = Function.bind,
nativeCreate = Object.create;
- 创建全局
_
我特意去找了underscore v0.1.0版本。
//把所以工具方法放在这个对象里面,都没有使用自执行函数
window._ = {);
现在的版本 是新建一个函数
var _ = function(obj) {
if (obj instanceof _) return obj;
if (!(this instanceof _)) return new _(obj);
this._wrapped = obj;
};
最后暴露这个_
函数,其他工具函数都挂载在这个下面,至于这个函数里面三行代码,有点搞不明白为什么这么写,我现在先研究这些好玩的具体的工具函数,然后回过头再来看整体为什么这么写。
- 一个神奇的中转函数
好多方法都用到这个函数
//optimeze 优化函数 一个神奇的函数
var optimezeCb = function(func, context, argCount) {
if (context === void 0) {
return func;
}
switch (argCount == null ? 3 : argCount) {
case 1: return function(value) {
return func.call(context, value);
};
case 2: return function(value, index) {
return func.call(context, value, index);
};
case 3: return function(value, index, collection) {
return func.call(context, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(context, accumulator, value, index, collection);
};
}
return function() {
return func.apply(context, arguments);
};
}
void 0 表示undefined,在一些低版本ie浏览器比如 6,7,8,undefined是可以被篡改的。
这个中转函数,如果存在参数,显式指定参数,也可以显式指定上线文。减少了代码量。一些迭代工具方法里面,不需要在显式指定了这些参数了,大大减少了整体代码量。
框架层面就先研究这么多,接下来更新编写具体工具方法层面。