underscore.js 源碼閱讀_?總結(jié)1

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對象
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,109評論 25 709
  • 拒絕思維懶惰,習(xí)慣于深度思考,永遠不要用戰(zhàn)術(shù)上的勤奮掩蓋戰(zhàn)略上的懶惰. 有能力的人絕對不習(xí)慣于加班,不懂得深度思考...
    CharmingM9閱讀 195評論 0 1
  • 普通的文件上傳,文件上傳 必須在form表單里面添加 enctype='multipart/form-data'。...
    西貝巴巴閱讀 744評論 0 0

友情鏈接更多精彩內(nèi)容