You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 定义一个匿名函数,马上调用它,包起来调用的时候可以创建闭包(function(global,factory){//内存中动态开辟了一块空间来执行这个里面的代码,对外是封闭的,可以访问外面的变量/*那么除了BOM浏览器的运行环境还能运行在什么环境中? => node环境 (node运行在V8引擎中,主要用来做中间件) 中间件很多, 架构与部署方面的中间件:webpack,grunt,gulp;功能方面的中间件:node.js(页面静态化) */if(typeofmodule==="object"&&typeofmodule.exports==="object"){// For CommonJS and CommonJS-like environments where a proper `window`module.exports=global.document ?
factory(global,true) :
function(w){if(!w.document){thrownewError("jQuery requires a window with a document");}returnfactory(w);};}else{factory(global);}}(typeofwindow!=="undefined" ? window : this,function(window,noGlobal){}));
/*! * jqueMey JavaScript Library v1.0.1 * * Includes Sizzle.js * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * Email: huangmiantong@126.com * * Date: 2018-12-11T22:04Z */// 定义一个匿名函数,马上调用它,包起来调用的时候可以创建闭包(function(global,factory){//在BOM浏览器的运行环境/*那么除了BOM浏览器的运行环境还能运行在什么环境中? => node环境 (node运行在V8引擎中,主要用来做中间件) 中间件很多, 架构与部署方面的中间件:webpack,grunt,gulp;功能方面的中间件:node.js(页面静态化) *///内存中动态开辟了一块空间来执行这个里面的代码if(typeofmodule==="object"&&typeofmodule.exports==="object"){module.exports=global.document ?
factory(global,true) :
function(w){if(!w.document){thrownewError("jQuery requires a window with a document");}returnfactory(w);};}else{factory(global);}}(typeofwindow!=="undefined" ? window : this,function(window,noGlobal){varversion="1.0.1",// Define a local copy of jQueryjQuery=function(selector,context){// The jQuery object is actually just the init constructor 'enhanced'// Need init if jQuery is called (just allow error to be thrown if not included)returnnewjQuery.fn.init(selector,context);};jQuery.fn=jQuery.prototype={init : function(selector,context){returnjQuery.makeArray(selector,context);},each: function(func){for(vari=0;i<this.length;i++){func.call(this,i,this[i]);}returnthis;},addClass : function(className){returnthis.each(function(index,element){element.className+=" "+className})},removeClass: function(className){returnthis.each(function(index,element){element.className=""})}};jQuery.makeArray=function(selector,context){var$eles=newSizzle(selector,context);$eles.prevObject=arguments.callee;$eles.__proto__=jQuery.fnreturn$eles;}// Expose jQuery and $ identifiers, even in AMD// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)// and CommonJS for browser emulators (#13566)if(!noGlobal){//BOM一定有window对象// jQuery一定是核心对象window.jQuery=window.$=jQuery;}returnjQuery;}));
未完待续...
The text was updated successfully, but these errors were encountered:
首先,我们先去官网把JQ的js相关文件download到本地,随意浏览一下源码,尝试理解jq的实现原理。
接着我们创建一个属于自己的js文件(取名为jquerMey-1.0.1js)。
这里先说一下解析源码的几个步骤:
学会分析组成及架构 =>
(JQ通过选择器(字符串)来检索所有匹配的DOM,并且进行批量操作,同时能够帮我们解决浏览器的兼容问题。)
学会看英文注释(不懂多用腾讯翻译君[手动滑稽])
先减后删
阅读思考作者的语义
尝试补全
好的,开搞吧!
一、创立一个html文件
可以看到,这边jQuery.fn.init 输出的是一个数组,还有一系列方法。我们一步步来。
二、删源码
这边先把JQ源码的所有东西都先删一下,可以看到,定义一个匿名函数,创建 闭包。
好,接着分析
写到这里,那么这里注释说的CommonJS是什么呢?这就涉及到了上面说的node了。
三、何为CommonJS
CommonJS是nodejs也就是服务器端广泛使用的模块化机制。 该规范的主要内容是,模块必须通过module.exports 导出对外的变量或接口,通过 require() 来导入其他模块的输出到当前模块作用域中。
四、JQuery的本质
可以看到,这里并没有给factory()传入第二个参数,默认为false,则会执行下面if的代码(即为BOM环境)。在if语句中,可以看到jQuery一定是核心代码,那么jQuery到底是什么呢?继续看。
这里的jQuery本质就是一个函数,jQuery有一个fn对象,并且fn有一个init函数。这里的makeArrray本质是返回一个数组。
往下看,可以看到这里jQuery的fn对象其实就是jQuery的原型对象;接着我们找到init方法。
分析完jQuery.fn,我们看看makeArray。Sizzle.js文件里面有很多算法方面的代码,我们先跳过,继续分析代码。此时,我们用Chrome打开html代码,可以看到,输出如图:(此时还没有写addClass函数所以报错了)
五、补全添加方法
继续补全,这样jQuery的 整体架构 就ok了,之后就是往里面添加东西。
(比如往里面添加addClass,removeClass,each方法)
六、实践一下
我们可以看到此时控制台里面已经有了我们添加的方法,让我们来实验一下。
结果如图:
附上全部代码:
未完待续...
The text was updated successfully, but these errors were encountered: