underscore.js 源码阅读_ 总结1

underscore.js 是一个用于扩展原生javascript功能和不足的第三方库,它提供的功能还是很基础,但是建起高楼大厦离不开它脚下的基石。backbone.js是一个mvc框架,就是依赖这个库。更多信息,参考underscore官网,也有翻译的中文文档

源码注释中文翻译

立即函数和闭包

整个underscore.js文件就是一个立即函数,它定义了一个函数并且立即执行:

(function(){
    //...
    //_=function(){...};
    //...
}.call(this));

在这个立即函数中有很多的局部变量内部函数, 它们只能作用域只在这个立即函数, 这样做的好处是隐藏了一些库功能的内部实现、减少全局变量的污染、实现私有变量。如实现一个生成唯一id的方法:

(function(){
    //...
     var idCounter = 0;                   //定义变量,这个变量在立即函数执行完成后不能被访问
    _.uniqueId = function(prefix) {      //生成id的函数(闭包)
    var id = ++idCounter + '';
    return prefix ? prefix + id : id;
  };
    //...
}.call(this));

仅当我们使用_.uniqueId()这个方法时, 才能修改idCounter的值, 这样就保证了我们产生的id是唯一的

_.noConflict()

在很多库中比如jQuery, 一般情况下我们使用$作为JQ对象, 但是如果你还需要用例外一个库, 但是这个库也是用$作为该库的全局对象, 那么如何解决这样的冲突?

一般的库中都有noConflict()这个解决命名冲突的问题, 那么它是怎么样的原理?

_.noConflict()这个函数的功能是恢复原来的window._对象, 并返回Underscore对象的引用

实现原理:

var previousUnderscore = root._;  //程序一开始就记录window._对象
...
root._ = _;                 // 将_对象赋值给window._变量        
...
_.noConflict = function() {
    root._ = previousUnderscore;  //还原原来的window._对象
    return this;                  //返回underscore对象
};

你可能感兴趣的:(underscore.js 源码阅读_ 总结1)