前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初窥jQuery源码

初窥jQuery源码

原创
作者头像
星辰大海c
发布2023-11-19 15:03:36
1340
发布2023-11-19 15:03:36
举报
文章被收录于专栏:前端学习教程前端学习教程

浏览器是多线程的,可以同时处理很多任务

  • GUI渲染线程: 渲染HTML/CSS代码的,最后在页面中绘制出图形 【GPU显卡】
  • JS引擎线程: 渲染和解析JS的
  • 事件触发线程: 监听事件是否触发的
  • 定时器触发线程: 监听定时器是否到达时间的
  • 异步HTTP请求线程: 用来从服务器获取资源文件或者数据的(link/script/img/ajax...)
  • WebWorker
  •  ...

JS中的同步异步编程

简单来说:

  • 同步 sync:事情必须一件一件的去做,上一件事情没有处理完,下一件事情是无法处理的
  • 异步 async:同时处理多件事情或者是上一件事情哪怕没有处理完,下一件事情也可以继续处理

进程:一个程序(或者浏览器打开一个页面)是开辟一个进程

线程:线程是进程中具体办事的,想同时办多件事,就需要开辟多个线程(一个进程中包含多个线程)

JS是单线程的:因为浏览器只会分配一个线程(JS引擎线程)去渲染和解析JS,所以在JS中大部分代码都是同步的

循环是同步的

避免死循环:死循环会占用JS引擎线程,导致这个线程无法再去处理其他程序了。

JS中有部分异步编程代码

异步微任务

  • requestAnimationFrame  (有争议)
  • Promise.then/catch/finally
  • async/await
  • queueMicrotask
  • IntersectionObserver
  • MutationObserver
  • process.nextTick (Node)
  •  ...

异步宏任务

  • 定时器 setTimeout/setInterval
  • 事件绑定/队列
  • XMLHttpRequest(ajax)/Fetch
  • MessageChannel
  • setImmediate (Node)
  • ...
代码语言:javascript
复制
var global = typeof window !== "undefined" ? window : this; //如果window存在,则global=window  如果不存在global=this
// JS代码可以运行的环境(平台)
//     + 浏览器 [webview]: 存在window全局对象。但是不支持CommonJS模块规范
//     + node环境:没有window,它的全局对象是Global;支持CommonJS模块规范
//     + webpack环境:基于node把资源文件合并打包,最后交给浏览器来运行,所以 它里面既有window全局对象,也支持CommonJS模块规范

// factory方法才是JQ的核心,之前的闭包只是为了做一个环境区分
var factory = function (window, noGlobal) {
    // 浏览器、webview:window=window   noGlobal=undefined
    // webpack环境:window=window  noGlobal=true =>  module.exports = factory执行的结果
    // JQ不支持在node环境下运行(因为里面不具备window全局对象)
    "use strict";

    var version = "3.6.0",
        // Define a local copy of jQuery
        jQuery = function (selector, context) {
            return new jQuery.fn.init(selector, context);
        };   
    jQuery.fn = jQuery.prototype = {
        // jQuery是一个构造函数,原型上提供的方法是供其实例使用的
    };

    // 知识点:"new 构造函数"是可以创建类的实例的,但是我们如何做到,不使用new,只把构造函数当做普通函数执行,也能创造这个类的实例?

    // 暴露API
    if ( typeof noGlobal === "undefined" ) {
        // 如果是在浏览器中运行JQ,我们直接在window上挂载jQuery/$属性,属性值是jQuery这个方法
        // $() 或者 jQuery()  就是把jQuery这个方法执行
        window.jQuery = window.$ = jQuery;
    } 
    // 在webpack环境中运行,则module.exports=jQuery;(使用 let $=require('jquery'))   
    return jQuery;
};

// 闭包
(function (global, factory) {
    // 如果当前JQ是运行在:浏览器或者webpack环境下,则global=window;如果运行在node环境下,则global=Global;支持CommonJS规范的是webpack和node环境
    "use strict";
    if (typeof module === "object" && typeof module.exports === "object") {
        // 支持CommonJS规范:webpack和node环境
        module.exports = global.document ?
            factory(global, true) :
            function (w) {
                if (!w.document) {
                    throw new Error("jQuery requires a window with a document");
                }
                return factory(w);
            };
    } else {
        // 不支持CommonJS规范:浏览器、webview
        factory(global);
    }

})(global, factory);

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 浏览器是多线程的,可以同时处理很多任务
  • JS中的同步异步编程
    • JS中有部分异步编程代码
      • 异步微任务
      • 异步宏任务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档