underscore.js 是一個用于擴展原生javascript功能和不足的第三方庫,它提供的功能還是很基礎(chǔ),但是建起高樓大廈離不開它腳下的基石。backbone.js是一個mvc框架,就是依賴這個庫。更多信息,參考underscore官網(wǎng),也有翻譯的中文文檔
立即函數(shù)和閉包
整個underscore.js文件就是一個立即函數(shù),它定義了一個函數(shù)并且立即執(zhí)行:
(function(){
//...
//_=function(){...};
//...
}.call(this));
在這個立即函數(shù)中有很多的局部變量和內(nèi)部函數(shù), 它們只能作用域只在這個立即函數(shù), 這樣做的好處是隱藏了一些庫功能的內(nèi)部實現(xiàn)、減少全局變量的污染、實現(xiàn)私有變量。如實現(xiàn)一個生成唯一id的方法:
(function(){
//...
var idCounter = 0; //定義變量,這個變量在立即函數(shù)執(zhí)行完成后不能被訪問
_.uniqueId = function(prefix) { //生成id的函數(shù)(閉包)
var id = ++idCounter + '';
return prefix ? prefix + id : id;
};
//...
}.call(this));
僅當(dāng)我們使用_.uniqueId()這個方法時, 才能修改idCounter的值, 這樣就保證了我們產(chǎn)生的id是唯一的
_.noConflict()
在很多庫中比如jQuery, 一般情況下我們使用$作為JQ對象, 但是如果你還需要用例外一個庫, 但是這個庫也是用$作為該庫的全局對象, 那么如何解決這樣的沖突?
一般的庫中都有noConflict()這個解決命名沖突的問題, 那么它是怎么樣的原理?
_.noConflict()這個函數(shù)的功能是恢復(fù)原來的window._對象, 并返回Underscore對象的引用
實現(xiàn)原理:
var previousUnderscore = root._; //程序一開始就記錄window._對象
...
root._ = _; // 將_對象賦值給window._變量
...
_.noConflict = function() {
root._ = previousUnderscore; //還原原來的window._對象
return this; //返回underscore對象
};