jQuery-源码阅读,pushStack()入栈方法

首先了解下栈:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。栈的规则是先进后出。下面看下jQuery中链式方法的使用:

$('ul').children('li').css("backgroundColor","#CCC");

首先选择页面中ul元素,再寻找其子元素中li,为其设置背景颜色为灰色。这里,ul首先入栈,子元素li后入栈,则css()最后操作的是li元素不是ul,这里是因为jQuery里所有链式操作都调用了jQuery中的工具方法——pushStack()。下面看下这个神奇函数的源码:

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对象,其中连接(merge)了jQuery和传入新对象(集合),然后设置ret对象的上级元素为this,返回ret。然后再看下返回上级的end()在源码中的实现:

end: function() {
		return this.prevObject || this.constructor(null);
	}

end()利用了pushStack中的prevObject,返回该对象,若该对象为空,返回构造函数。

在源码中多次使用这个入栈函数,如map()、slice()、eq()等常用方法中都调用了这个入栈方法。

你可能感兴趣的:(jquery,源码,前端,pushStack函数)