摘要:而事實(shí)上為了消除這個(gè)現(xiàn)象,衍生出來(lái)的模式有很多,比如策略模式,單例模式,迭代器模式等。比如自己定義一個(gè)迭代器這就是一個(gè)簡(jiǎn)單的內(nèi)部迭代器。迭代器的應(yīng)用說(shuō)了迭代器的基本原理后,應(yīng)該來(lái)點(diǎn)干貨了。
程序的bug王
請(qǐng)不要被標(biāo)題所迷惑,這樣說(shuō)bug王,只是為了吸睛。 在程序的世界里,我們要多喝茶,慢慢聊?;貧w正題,這里想說(shuō)的bug王指的是條件的分支語(yǔ)句。 比如: if...else if...else if... else if.........esle... 。想這樣的。
看個(gè)實(shí)例:
var model = function(flag){ if(flag===0){ return "this is zero"; }else if(flag === 1){ return "this is first"; }else if(falg === 2){ return "this is second"; }else { ... } }
像這樣的。 因?yàn)槊恳淮螚l件判斷都是對(duì)性能的一次rape。而事實(shí)上為了消除這個(gè)現(xiàn)象,衍生出來(lái)的模式有很多,比如: 策略模式,單例模式,迭代器模式等。這里主要想講一下,迭代器模式.
迭代器模式迭代器其實(shí)就是一個(gè)遍歷,能夠順序遍歷一個(gè)聚合對(duì)象中的一些屬性. 比如數(shù)組中的.Array.prototype.forEach。
其實(shí)就是遍歷,然后將獲得的參數(shù)進(jìn)行回調(diào)處理(?。?!注意,迭代器最重要的一點(diǎn)就是將循環(huán)中的遍歷數(shù)組的參數(shù)傳給回調(diào)函數(shù)處理.)
var arr = [1,2,3,4,5]; arr.forEach(function(val,index,arr){ ... })
而且迭代器模式你可以自定義迭代,比如內(nèi)部迭代,外部迭代,順序迭代,倒序迭代等等. 由于懶,所以就列一個(gè)比較常見(jiàn)的順序迭代吧。
通常也就是使用了for循環(huán)來(lái)構(gòu)建的。 比如自己定義一個(gè)迭代器
var each = function(arr,fn){ for(var i = 0,val;val = arr[i++];){ if(val==false){ break; } fn(val,index,arr); } }
這就是一個(gè)簡(jiǎn)單的內(nèi)部迭代器。即將數(shù)組類(lèi)型進(jìn)行簡(jiǎn)單的遍歷,然后如果遍歷完成則返回。
迭代器的應(yīng)用說(shuō)了迭代器的基本原理后,應(yīng)該來(lái)點(diǎn)干貨了。
迭代器在各種語(yǔ)言中,差不多都已經(jīng)普及了,所以重構(gòu)已有的方法是沒(méi)有什么價(jià)值的。但迭代器最主要的功能是自定義一些系列算法,將所需要的提取出來(lái). 比如: 事件模型事件的獲取。
var bind = (function() { if (document.addEventListener) { return function(ele, fn, type) { ele.addEventListener(type, fn, false); } } else if (document.attachEvent) { //檢測(cè)低版本的IE return function(ele, fn, type) { ele.attachEvent(type, fn); } } else { return function(ele,fn,type){ ele[`on${type}`] = fn; } } })();
可以看出里面充斥著分支語(yǔ)句,為了消除分支。可以將不同的方法包裝起來(lái),然后使用迭代器統(tǒng)一遍歷.
var bind = (function(){ var DOM2 = (function(){ if (document.addEventListener) { return function(ele,fn,type){ ele.addEventListener(type,()=>{fn();},false); } }else { return false; } })(); var IE = (function(){ if(document.attachEvent){ return function(ele,fn,type){ ele.attachEvent(type,fn); } }else{ return false; } })(); var DOM0 = function(ele,fn,type){ ele[`on${type}`] = ()=>{fn();}; } //添加迭代器 var Itera = function(){ for(var i = 0,val;val = arguments[i++];){ if(typeof val === "function"){ return val; } } } return Itera(DOM2,IE,DOM0); })(); console.log(bind); ////function (ele,fn,type){ele.addEventListener(type,()=>{fn();},false);}
接著你就可以使用bind()函數(shù)進(jìn)行事件的綁定處理。但是這個(gè)應(yīng)該算是將原來(lái)簡(jiǎn)單的變復(fù)雜了,因?yàn)楝F(xiàn)在事件模式幾乎只有這3種(原生). 拓展性我就不說(shuō)了。 所以一般用來(lái)判斷事件綁定的話,推薦還是使用上面那個(gè)方式,來(lái)得更直接.
但可以從上面的例子可以看出,迭代器模式只是提供一種思想,提取最精華的部分,通過(guò)遍歷選出最優(yōu)解。模式這么多,關(guān)鍵要找到最適合你的。還是那句話,如果這個(gè)坑 坑不死我,我一定會(huì)踩更多的坑。 所以多實(shí)踐,多學(xué)習(xí),多踩坑才是進(jìn)步的證明。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91598.html
摘要:相比于,它將也作為隱變量納入到變分推斷中。結(jié)論綜述本文的結(jié)果表明了變分推斷確實(shí)是一個(gè)推導(dǎo)和解釋生成模型的統(tǒng)一框架,包括和。 作者丨蘇劍林單位丨廣州火焰信息科技有限公司研究方向丨NLP,神經(jīng)網(wǎng)絡(luò)個(gè)人主頁(yè)丨kexue.fm前言我小學(xué)開(kāi)始就喜歡純數(shù)學(xué),后來(lái)也喜歡上物理,還學(xué)習(xí)過(guò)一段時(shí)間的理論物理,直到本科畢業(yè)時(shí),我才慢慢進(jìn)入機(jī)器學(xué)習(xí)領(lǐng)域。所以,哪怕在機(jī)器學(xué)習(xí)領(lǐng)域中,我的研究習(xí)慣還保留著數(shù)學(xué)和物理的...
摘要:貪心算法與動(dòng)態(tài)規(guī)劃算法的差異貪心算法和動(dòng)態(tài)規(guī)劃算法都要求問(wèn)題具有最優(yōu)子結(jié)構(gòu)性質(zhì),這是類(lèi)算法的一個(gè)共同點(diǎn)。 貪心算法的基本要素對(duì)于一個(gè)具體的問(wèn)題,怎么知道是否可用貪心算法解此問(wèn)題,以及能否得到問(wèn)題的最優(yōu)解呢?這個(gè)問(wèn)題很難給予肯定的回答。但是,從許多可以用貪心算法求解的問(wèn)題中看到這類(lèi)問(wèn)題一般具有2個(gè)重要的性質(zhì):貪心選擇性質(zhì)和最優(yōu)子結(jié)構(gòu)性質(zhì)。 1、貪心選擇性質(zhì)所謂貪心選擇性質(zhì)是指所求問(wèn)題的整...
摘要:假定出售一段長(zhǎng)度為英寸的鋼條的價(jià)格為單位,鋼條長(zhǎng)度均為整英寸。注若長(zhǎng)度為英寸的鋼條的價(jià)格足夠大,最優(yōu)解可能就是完全不需要切割??紤]長(zhǎng)度為的情況,下圖給出了英寸鋼條的所有切割方案。 DP和分治的相似 都是通過(guò)組合子問(wèn)題的解來(lái)求解原問(wèn)題。 DP中的programming指的是一種表格法,而非coding。 DP和分治的不同 分治步驟:(例如歸并排序) 將問(wèn)題劃分為互不相交的子問(wèn)題 ...
閱讀 1919·2021-09-23 11:21
閱讀 1704·2019-08-29 17:27
閱讀 1062·2019-08-29 17:03
閱讀 729·2019-08-29 15:07
閱讀 1927·2019-08-29 11:13
閱讀 2385·2019-08-26 12:14
閱讀 930·2019-08-26 11:52
閱讀 1736·2019-08-23 17:09