文章目录

期末事情特别多,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是可以被篡改的。

这个中转函数,如果存在参数,显式指定参数,也可以显式指定上线文。减少了代码量。一些迭代工具方法里面,不需要在显式指定了这些参数了,大大减少了整体代码量。

框架层面就先研究这么多,接下来更新编写具体工具方法层面。

文章目录