简单来说:
进程:一个程序(或者浏览器打开一个页面)是开辟一个进程
线程:线程是进程中具体办事的,想同时办多件事,就需要开辟多个线程(一个进程中包含多个线程)
JS是单线程的:因为浏览器只会分配一个线程(JS引擎线程)去渲染和解析JS,所以在JS中大部分代码都是同步的
循环是同步的
避免死循环:死循环会占用JS引擎线程,导致这个线程无法再去处理其他程序了。
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);
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。