zoukankan      html  css  js  c++  java
  • 学习源码第二天(渐入佳境)

    (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);
        }

     这一步做了什么事情呢? 我们来看 jQuery( ).css(), jQuery( ).width()这些方法都有一个 jQuery( ), jQuery( )返回的是一个JQuery.fn.init的一个实例,说明JQuery.fn.init.prototype上有方法,根据272行  jQuery.fn.init.prototype = jQuery.fn; 这是把JQuery的原型的地址给了init的原型,这就是引用类型的赋值,也就是JQuery的原型一改变那么init的原型也随之而动! 【 像css(),width()这些方法都是在JQuery的原型上定义的,然后才引用给init的原型 】 问题 : 为什么要把方法写在jQuery原型上?为什么要把JQuery原型上的方法用init的原型去替换?为什么init要存在于JQuery的原型?

  • 相关阅读:
    linux创建www用户组和用户
    php+nginx改为socket
    laravel重写
    centos7精简版(minimal)killall: command not found
    php+nginx 整合
    php编译安装
    Nginx的编译安装
    sql 中常见的控制流语句
    sqlserver 中常见的函数 数学函数
    sqlserver 中常见的函数字符串函数
  • 原文地址:https://www.cnblogs.com/wchjdnh/p/10747947.html
Copyright © 2011-2022 走看看