什么是jquery中pushstack中的prevObject和context?

时间:2015-06-22 18:23:14

标签: javascript jquery

我理解pushstack函数是如何工作的,我也理解如何将它用于我的插件(我猜这是它最常用的,仅供内部使用和end()正常运行和其他类似的方法)。

现在下面是pushstack的jquery源代码,看看:

pushStack: function( elems ) {
    // Build a new jQuery matched element set
    var ret = jQuery.merge( this.constructor(), elems );
    // Add the old object onto the stack (as a reference)
    ret.prevObject = this;
    ret.context = this.context;
    // Return the newly-formed element set
    return ret;
},

真正在该功能中发生了很多事情并且我得到了大部分内容,但是我有一个小问题,理解下面的代码行: -

ret.prevObject = this;
ret.context = this.context;

prevObjectcontext是什么?谁能给我一个线索,它绝对不是一个javascript的东西?

1 个答案:

答案 0 :(得分:2)

基本上prevObject用于允许jquery选择器链接语法的灵活性。

  

大多数jQuery的DOM遍历方法都在jQuery对象实例上运行,并生成一个新的,与不同的DOM元素集匹配。当发生这种情况时,就好像将新的元素集推送到在对象内维护的堆栈上。每个连续的过滤方法将新元素集推送到堆栈

每次创建一个新的过滤器时,都会构建一个与你的选择器匹配的新jquery实例,并将前一个存储在其中以允许.end()addBack()函数工作(大多数DOM横向函数在内部使用pushStack)。如果未使用此属性,则每个选择器都会忘记前一个选择器,并且它不会像堆栈那样运行。想想而不是 prevObject ,这样会更容易理解。

jQuery 1.10中不推荐使用context属性,仅用于支持live()方法,但必须添加它,因为构造返回对象将空jQuery构造函数合并为第一个参数和一组元素作为第二个。

var ret = jQuery.merge( this.constructor(), elems );

因为.merge返回修改后的第一个数组,所以它的context属性可能没有正确的值,因此被正确的this.context覆盖

检查this jsfiddle并打开控制台。您将看到prevObject的第一个值是我们创建新选择器时的文档,然后是ul元素,因为我们使用find进行过滤。此外,您可以转到最后一个过滤器并再次查找整个选择器链直到文档。

我建议您在生产中使用JQuery API而不是此属性作为参考,但这样可以让您知道已应用于获取给定DOM元素集的所有选择器的结果。