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
varclass2type={};vartoString=class2type.toString;jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(i,name){class2type["[object "+name+"]"]=name.toLowerCase();});
DOMEval: 该方法通过动态创建一个
script
标签,然后把标签添加到页面中,把代码执行,然后移除script
标签,该方法并没有使用eval
,因为jQuery使用了严格模式use strict
,在严格模式中不能使用eval
,该方法就是等同于eval
。参数说明:参数一是代码字符串,参数二是添加到页面的位置。jQuery的原型中有个
eq
的方法,看上面的代码,我们发现它对参数的处理非常好,首先是+i
把传入进来的参数i
转换数值形式的,然后是判断i
是正数还是负数,如果传入的是负数默认会与数组的长度相加得到正确的值。该方法使用了一个pushStack
方法,我们看看该方法是干什么的?pushStack
是jQuery中的静态方法,使用传入的元素生成一个新的 jQuery 元素,注意该方法添加了属性prevObject
保留了this
指向(this
代表的是匹配元素集合),这样做是为什么?其实jQuery的很多方法里面都有return this
这样的写法来实现链式调用,但是实现链式调用的前提要保证每一个return this
都不能具有破坏性。如果某一个方法真的要修改匹配元素集合 , 那么它就会调用pushStack
方法 , 把之前的元素集合保存起来 , 以便以后使用end
方法恢复。方法中的
this.constructor()
表示创建当前实例的函数,也就是jQuery本身,当jQuery本身执行的时候没有传入任何参数的情况下回会返回一个空对象,详细介绍在 jQuery源码阅读 #23merge
方法是将连个数组拼接到一起,返回一个新的数组,注意当第一个参数传入jQuery函数的返回值时,length
是在原型中被定义的,而且初始值为0end
方法是恢复匹配元素集合的,继续实现链式调用来分析一下jQuery是如何进行数据类型检测的,因为jQuery中代码都写在一个自执行函数里面,通过闭包的形式来隐藏变量。关于和判断数据类型的有关的有两部分代码。
下面代码的往jQuery函数上拓展的静态方法
通过上面的代码,我们发现jQuery将所有的数据类型都都保存在一个叫
class2type
的变量中。each
方法是将传入的数组或对象进行循环遍历并执行回调函数,type
方法是判断数据类型的方法,我在这里详细解释一下,先判断传入进来的参数是不是null
和undefined
如果是就两个值就通过调用String()
方法并返回,如果不是这两个值,然后再判断是不是object
和function
如果是将会把class2type
的变量存储的对应的数据类型返回,如果该变量没有对应的数据类型将会返回一个object
,如果不是object
和function
类型将会继续使用typeof
检测。The text was updated successfully, but these errors were encountered: