学习源码第二天(渐入佳境)

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

原文地址:https://www.cnblogs.com/wchjdnh/p/10747947.html

时间: 2024-08-09 03:17:09

学习源码第二天(渐入佳境)的相关文章

Duilib 学习源码系列1-创建控件

好了,昨天研究出了为什么加载xml结束以后我在自己新建一个控件位置不能调整,原来要先add才能调属性. 本来这个是昨天的任务,虽然这块内容是前天就看完的,权当边写边复习吧. 上一篇提到 <VerticalLayout name="window" bkcolor="#FFFFFFFF" bkcolor2="#FFAAAAA0" bkcolor3="#00000000"> 代表了一个控件字符串; 上次忘记说了 及时经过

MINA2 源码学习--源码结构梳理

一.mina的整体框架结构及案例: 1.整体结构图: 简述:以上是一张来自网上比较经典的图,整体上揭示了mina的结构,其中IoService包含客户端IoConnector和服务端IoAcceptor两部分.即无论是客户端还是服务端都是这个结构.IoService封装了网络传输层(TCP和UDP),而IoFilterChain中mina自带的filter做了一些基本的操作之外,支持扩展.经过FilterChain之后最终调用IoHandler,IoHandler是具体实现业务逻辑的处理接口,具

JAVAweb例程学习源码分享,超级全!

JAVAweb例程学习源码分享,超级全!我自己也从里面学习到了很多东西! 1.BBS论坛系统(jsp+sql)2.ERP管理系统(jsp+servlet)3.OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)4.博客系统(struts+hibernate+spring)5.车辆管理系统(struts+hibernate+spring+oracle)6.家庭理财系统(java+applet)7.教材订购系统(jsp+servlet+mysql)8.酒店管

跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?(源码感悟)

1 前言 由于现在微服务很流行,越来越多企业采用了SpringCloud微服务架构,而SpringBoot则是快速构建微服务项目的利器.于是源码笔记以此为切入点,将SpringBoot作为我们源码分析的第一个开源项目,之后还会对更多开源项目进行源码分析.要进行源码分析,笔者结合自身经历来跟大家聊聊我们为什么要学习源码这个话题,大家一起探讨学习. 我们程序员在开发代码时每天都在使用别人写好的框架,无论你是在使用Spring生态的Spring核心,SpringMVC,SpringBoot和Sprin

[译] 理解PHP内部函数的定义(给PHP开发者的PHP源码-第二部分)

文章来自:http://www.aintnot.com/2016/02/10/understanding-phps-internal-function-definitions-ch 原文:https://nikic.github.io/2012/03/16/Understanding-PHPs-internal-function-definitions.html 欢迎来到"给PHP开发者的PHP源码"系列的第二部分. 在上一篇中,ircmaxell说明了你可以在哪里找到PHP的源码,它

Java入门基础学习源码,有C或C++语言基础的可以快速掌握

以下为完整源码,需要1.8版本JDK,否则部分新特性可能出现兼容问题,去掉注释号即可运行 package hello; import java.util.Scanner; public class Hello { public static void main(String[] args) { // TODO 自动生成的方法存根 /* //这是第一个程序 System.out.println("这是一个减法计算器"); Scanner in = new Scanner(System.i

设计模式之迭代器模式解析学习源码(十八)

原文献上, 点击滴滴滴 迭代器模式(Iterator)定义: 提供一种方法顺序访问聚合对象的各个元素吗而又不暴露该对象的内部展示 不用Iterator的坏处 原文中编写了三个简单的集合 ArraryList HashSet LinkedList 原先是没有实现Iterable 内部没有具体实现iterator 问题1: 遍历的时候遍历了几次 使用数组遍历的时候实际是遍历了两次, 由于System.arrayCopy 和 set的 toArray 看不到源码, 但是LinkedList 可以看到链

Dubbo学习-源码学习

Dubbo概述 dubbo框架提供多协议远程调用,服务提供方可以是分布式部署.dubbo框架可以很简单的帮我们实现微服务. 此处援引官网上图片 dubbo分为客户端和服务提供方 服务方将服务注册到注册中心 客户端从注册中心获取已注册服务访问方式 客户端通过指定协议访问服务提供方 根据dubbo架构,源码分析我们主要切入点是: dubbo配置如何生效 客户端如何调用服务 注册的服务如何保证被调用到 dubbo远程调用的协议如何工作 针对以上我们来分析Dubbo源码: Dubbo源码是maven管理

【转】MaBatis学习---源码分析MyBatis缓存原理

[原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然也在内部提供了相应的支持.通过在框架层面增加缓存功能,可减轻数据库的压力,同时又可以提升查询速度,可谓一举两得.MyBatis 缓存结构由一级缓存和二级缓存构成,这两级