天天看點

jQuery源碼閱讀[1]noConflict

noConflict主要用于避免jQuery和$與其他庫沖突。

1. 先來看一下他的用法

主要有兩種情況,一種是先引入了jQuery庫,另一種是後引入jQuery庫,無論哪種情況,隻要調用了$.noConflict()方法,均可以很好的處理全局變量名沖突的情況,其原理是将jQuery對象指派給别的變量,進而讓出$和jQuery這兩個變量名。

1.先引入jQuery,即$和jQuery有可能在後面被修改,這時你可以發揮紳士風度,有預見性的主動将這兩個變量名讓出,如下所示:

var iQuery = $.noConflict();
console.log(iQuery("div").html()); //正确輸出
           
$ = 123; //不會影響jQuery的使用,因為現在我們用的是 “iQuery”
           

2.在jQuery被引入之前已經有别的庫占用了$或jQuery,這種情況下jQuery的引入便覆寫了了這兩個變量,為了讓先前的庫仍可以使用$或jQuery變量,你指令jQuery讓出這兩個變量,即調用$.noConflict()方法。此時jQuery做了兩件事,一是将jQuery對象指派給新的變量,二是将$或jQuery變量重新指派為之前被覆寫的庫。該情況如下:

<script src="lib1.js"></script>
<script src="./jquery2.0.3.js"></script>
<script>
	var iQuery = $.noConflict();
</script>
           

2. 我們來看一下jQuery中的實作,代碼非常簡單

// Map over jQuery in case of overwrite
_jQuery = window.jQuery,

// Map over the $ in case of overwrite
_$ = window.$,
           

這段代碼是在jQuery剛開始的地方,主要應對第二種情況,即$或jQuery已經被占用的情況,jQuery将他們緩存,如果使用者決定使用noConflict()方法讓出這兩個變量,則将緩存的内容還原到全局變量中。

noConflict: function( deep ) {
	if ( window.$ === jQuery ) {
		window.$ = _$;
	}

	if ( deep && window.jQuery === jQuery ) {
		window.jQuery = _jQuery;
	}

	return jQuery;
},
           

可以看到如果調用noConflict方法是使用true參數,則将jQuery變量也讓出,否則隻讓出$。不管怎樣最會會将jQuery對象傳回。