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