將觀察者都搞在一個(gè)集合中,當(dāng)被觀察者發(fā)生變化,就直接找到這個(gè)集合,并運(yùn)行其中的函數(shù)。
再擴(kuò)展一下:
可能有很多被觀察者,每個(gè)被觀察者都對(duì)應(yīng)一個(gè)觀察者集合,所以我們需要一個(gè)‘池’ 來(lái)存儲(chǔ)這些集合。那么 鍵值對(duì) 的格式就很符合。 { 被觀察者1:[觀察者集合] , 被觀察者2:[觀察者集合]....}
再擴(kuò)展一下:
可能有很多被觀察者,每個(gè)被觀察者都對(duì)應(yīng)一個(gè)觀察者集合,所以我們需要一個(gè)‘池’ 來(lái)存儲(chǔ)這些集合。那么 鍵值對(duì) 的格式就很符合。 { 被觀察者1:[觀察者集合] , 被觀察者2:[觀察者集合]....}
2016-11-19
最新回答 / 菜狗
那里面的self本身不是window,你調(diào)試的時(shí)候顯示window是因?yàn)閏hrome自己本身把window存在了一個(gè)叫self的變量上,原來(lái)的里面的self值已經(jīng)return給外面的cbs了。。。= =不執(zhí)行示例代碼直接打印self也是window
2016-11-17
關(guān)于slice感覺有點(diǎn)誤解大家,并不是因?yàn)槠ヅ涞慕Y(jié)果是數(shù)組,而是jquery原型上封裝了slice方法
2016-11-15
“除此之外類一的所有方法都是拷貝到當(dāng)前實(shí)例對(duì)象上。類二則是要通過scope連接到原型鏈上查找,這樣就無(wú)形之中要多一層作用域鏈的查找了” 這句話啥意思
2016-11-13
$.data()和.data()方法雖然大體的意思一樣,但是2個(gè)接口在處理上卻有差別,mark。
2016-11-11
javascript對(duì)象與DOM對(duì)象的相互引用易產(chǎn)生內(nèi)存泄漏。
為了避免內(nèi)存泄漏,我們要盡量避免 引用數(shù)據(jù)(這里的引用數(shù)據(jù)可以說是javascript對(duì)象) 直接依附在DOM對(duì)象上。
為了避免內(nèi)存泄漏,我們要盡量避免 引用數(shù)據(jù)(這里的引用數(shù)據(jù)可以說是javascript對(duì)象) 直接依附在DOM對(duì)象上。
2016-11-11
注意:javascript中的Array對(duì)象的indexOf()方法,如果要檢索的字符串值沒有出現(xiàn),則該方法返回 -1, 返回-1,返回-1 ?。?!
2016-11-11
定義一個(gè)函數(shù)(對(duì)象),該函數(shù)的每一個(gè)實(shí)例內(nèi)部存在一個(gè)數(shù)組,這個(gè)數(shù)組包含了所有觀察者。實(shí)例中的add remove fire等方法都是對(duì)這個(gè)數(shù)組進(jìn)行操作。
2016-11-10
‘通過回調(diào)函數(shù)callback返回的ture/false的布爾值結(jié)果就可以來(lái)判斷當(dāng)前是否要強(qiáng)制退出循環(huán)’,這樣做的好處:
提高性能
為什么呢?
比如我們要把包含5個(gè)<li>的jQuery對(duì)象中的前三個(gè)li元素隱藏。
兩種方法:
1 $fiveLi.each(function(index,ele){if(index <3){$(ele).hide()}});//這樣會(huì)循環(huán)5次
2 $fiveLi.each(function(index,ele){if(index >= 3){return false} $(ele).hide()}) // 這樣只會(huì)循環(huán)3次
提高性能
為什么呢?
比如我們要把包含5個(gè)<li>的jQuery對(duì)象中的前三個(gè)li元素隱藏。
兩種方法:
1 $fiveLi.each(function(index,ele){if(index <3){$(ele).hide()}});//這樣會(huì)循環(huán)5次
2 $fiveLi.each(function(index,ele){if(index >= 3){return false} $(ele).hide()}) // 這樣只會(huì)循環(huán)3次
回顧:pushStack做了四件事
1 新建一個(gè)空的jQuery對(duì)象
2 新建的空對(duì)象將參數(shù)(實(shí)際上也是一個(gè)對(duì)象)包含合并
3 將合并后的jQuery對(duì)象的pervObject指向this
4 返回合并后的對(duì)象
再來(lái)分析一下eq()的源碼:
eq()首先解析傳入的參數(shù),該不動(dòng)的不動(dòng),該轉(zhuǎn)換的轉(zhuǎn)換;然后調(diào)用pushStack()函數(shù),并將對(duì)應(yīng)的DOM對(duì)象作為參數(shù)傳入,然后將pushStack()函數(shù)返回的jQuery對(duì)象返回。
注意: 返回的jQuery對(duì)象的prevObject已經(jīng)指向了調(diào)用eq()方法的對(duì)象。比如: aObj.eq(0).prevObject-->aObj
1 新建一個(gè)空的jQuery對(duì)象
2 新建的空對(duì)象將參數(shù)(實(shí)際上也是一個(gè)對(duì)象)包含合并
3 將合并后的jQuery對(duì)象的pervObject指向this
4 返回合并后的對(duì)象
再來(lái)分析一下eq()的源碼:
eq()首先解析傳入的參數(shù),該不動(dòng)的不動(dòng),該轉(zhuǎn)換的轉(zhuǎn)換;然后調(diào)用pushStack()函數(shù),并將對(duì)應(yīng)的DOM對(duì)象作為參數(shù)傳入,然后將pushStack()函數(shù)返回的jQuery對(duì)象返回。
注意: 返回的jQuery對(duì)象的prevObject已經(jīng)指向了調(diào)用eq()方法的對(duì)象。比如: aObj.eq(0).prevObject-->aObj
2016-11-09
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 new jQueryObject
return ret;
}
// 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 new jQueryObject
return ret;
}
2016-11-09
大家一定要注意:eq() 方法取出來(lái)的是 jQuery對(duì)象,而get()取出來(lái)的是DOM對(duì)象。
2016-11-09
解釋一下這句話(流程解析中的1): ‘因?yàn)閏onstructor是指向構(gòu)造器的,所以這里就等同于調(diào)用jQuery()方法了’
我們知道:
1 jQuery = function(){ return new jQuery.fn.init(); }
2 jQuery.fn = jQuery.prototype = { init:function(){//.....} , constructor:jQuery }
所以 this.constructor() == jQuery()
我們知道:
1 jQuery = function(){ return new jQuery.fn.init(); }
2 jQuery.fn = jQuery.prototype = { init:function(){//.....} , constructor:jQuery }
所以 this.constructor() == jQuery()
2016-11-09