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对象
};