学习源码第二天(渐入佳境)
Posted wchjdnh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习源码第二天(渐入佳境)相关的知识,希望对你有一定的参考价值。
(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 ready DOM加载 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); }
以上是关于学习源码第二天(渐入佳境)的主要内容,如果未能解决你的问题,请参考以下文章