學習原始碼第二天(漸入佳境)
(function(window,undefined) { window.$ = function() { console.log('我是$函式'); }; })(window);
丟擲問題:1.自呼叫函式是可以訪問外界的全域性變數的,為什麼還要把window當做一個引數?2.undefined作為引數是什麼意思?
個人理解問題1:首先傳實參window表名了形參window就是外界的全域性變數window,那麼為什麼明明可以直接訪問外界的window,卻要當成一個區域性變數去訪問?有兩點好處: 1.如果每次都要用到window,都要去外界找全域性window,這找全域性的過程比區域性變數來的慢2.用區域性變數有利於壓縮,我可以把形參window寫成e,少了很多字母,檔案大小會小很多。
個人理解問題2:undefined為什麼當做一個形參(其實實參沒傳就是undefined), 原因就是IE678 的undefined的值不是關鍵字可以當做變數修改
// "use strict"嚴格模式 沒必要開啟 var // A central reference to the root jQuery(document) rootjQuery, // The deferred used on DOM readyDOM載入 readyList, // Support: IE9 // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` core_strundefined = typeof undefined, // Use the correct document accordingly with window argument (sandbox) location = window.location,//地址資訊 document = window.document,//document物件 docElem = document.documentElement,//html物件 // Map over jQuery in case of overwrite _jQuery = window.jQuery,//外界的JQuery賦值給_JQuery,防衝突,比如說其他庫也有一個JQuery,可以把這個_JQuery充當其他庫的JQuery // Map over the $ in case of overwrite _$ = window.$, //外界的$賦值給_$,防衝突,同上 // [[Class]] -> type pairs class2type = {},//$.type()會用到型別判斷 定義了一個物件,有物件的方法 // List of deleted data cache ids, so we can reuse them core_deletedIds = [],//資料快取有關,2.0.3已經採取面向物件的方式,這裡就是一個空陣列,有陣列的方法 core_version = '2.0.3', // Save a reference to some core methods core_concat = core_deletedIds.concat,/* core_push = core_deletedIds.push,* 這裡將陣列的常見方法 concat、push、slice、indexOf賦值到一個新變數,好壓縮 core_slice = core_deletedIds.slice,* core_indexOf = core_deletedIds.indexOf,* core_toString = class2type.toString,*同理,把物件的hasOwnProperty賦值到一個新變數 core_hasOwn = class2type.hasOwnProperty,* core_trim = core_version.trim,*版本號本身是一個字串,字串有trim方法,賦值給新變數 */
原始碼中採用先var 宣告一個變數再後續賦值,這樣的好處還是 利於壓縮(如果寫表示式就沒辦法壓縮,必須寫成那樣,比如方法名你不能變) ,變數可以用一個字母表示。 還有一個好處是可以知道變數代表的意思,方便維護 比如a+10 (10你不知道什麼意思)和 var length = 10; a+ length
接下來再來說說 core_strundefined = typeof undefined typeof undefined的值是"undefined",core_strundefined = "undefined"。如果core_strundefined是"undefined"那麼這個變數未定義。 window.a == undefined也可以檢查,但是這種在XmlNode.method不支援,這是小眾情況,我們在HTML環境下,但是為了完美還是用typeof undefined。
為什麼不直接寫 core_strundefined = "undefined"? 這樣不利於壓縮。
jQuery = function(selector, context) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init(selector, context, rootjQuery); }