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