四虎精品视频-四虎精品成人免费网站-四虎黄色网-四虎国产视频-国产免费91-国产蜜臀97一区二区三区

JavaScript中yield實(shí)用簡(jiǎn)潔實(shí)現(xiàn)方式

剛才忽然靈機(jī)一動(dòng),迭代器我們很少會(huì)真的直接傻乎乎的next去遍歷的,那為什么一定要實(shí)現(xiàn)這個(gè)傻乎乎的next呢?直接實(shí)現(xiàn)each,這樣,這樣反過(guò)來(lái),Yeah,一通百通,不一會(huì)兒就寫(xiě)出了第一個(gè)超簡(jiǎn)潔版本:
復(fù)制代碼 代碼如下:
function yieldHost(yieldFunction)
{
return function (processer)
{
var yield = function (result)
{
processer(result)
};
yieldFunction(yield);
};
}

思路一換,代碼真簡(jiǎn)潔。
先附上例子,然后來(lái)談原理。
首先我們需要一個(gè)函數(shù)來(lái)進(jìn)行枚舉,像這樣:
復(fù)制代碼 代碼如下:
function fun(yield)
{
for (var i = 0; i < 100; i++)
yield(i);
}

或是這樣:
復(fù)制代碼 代碼如下:
function fun(yield)
{
yield(1);
yield(2);
yield(3);
}

由于實(shí)現(xiàn)方式與C#的不同,所以在循環(huán)體內(nèi)也不用什么yield break或是yield continue這樣的語(yǔ)法,直接break或是continue就好了。
然后是實(shí)際的運(yùn)用,yieldHost函數(shù)可以將上面的符合要求的fun函數(shù)轉(zhuǎn)換為一個(gè)枚舉器:
var enumerator = yieldHost(fun);
這個(gè)枚舉器其實(shí)也是一個(gè)函數(shù),像jQuery的each函數(shù)一樣,接收一個(gè)處理函數(shù)來(lái)處理枚舉:
復(fù)制代碼 代碼如下:
enumerator(function (item)
{
window.alert(item);
});

接下來(lái)談?wù)勗怼?
對(duì)于傳統(tǒng)的枚舉器來(lái)說(shuō),我們會(huì)認(rèn)為枚舉器應(yīng)該在每次調(diào)用返回一個(gè)值,這就是next方法,但就像陳子瀚說(shuō)的,這需要在yield的時(shí)候把函數(shù)停住,雖然可以實(shí)現(xiàn),但真的很麻煩。
但!事實(shí)上我發(fā)現(xiàn),大多數(shù)時(shí)候,我們都是用foreach這樣的語(yǔ)法來(lái)訪問(wèn)枚舉器的。這樣一來(lái)就給了我一個(gè)非常討巧的辦法,不實(shí)現(xiàn)next方法,而是實(shí)現(xiàn)each方法。
each方法和next的方法的區(qū)別在哪里呢?熟悉jQuery的朋友就會(huì)知道,each方法其實(shí)可以視為將next倒過(guò)來(lái),不是返回枚舉值,而是接收一個(gè)函數(shù),把枚舉值當(dāng)作參數(shù)傳進(jìn)去。
正是這一倒,所有問(wèn)題都迎刃而解了。我們沒(méi)有必要去暫停一個(gè)函數(shù)的執(zhí)行,只需要將處理枚舉值的邏輯注到這個(gè)函數(shù)里面去就完了。所以事實(shí)上這里的yieldHost就是完成了一個(gè)倒裝的工作,把enumerator接收的那個(gè)函數(shù)(也就是window.alert( item ),注到了枚舉函數(shù)中(即fun)。最終執(zhí)行的效果就像是這樣:
復(fù)制代碼 代碼如下:
function fun(yield)
{
window.alert(1);
window.alert(2);
window.alert(3);
}

所以就誕生了這個(gè)超簡(jiǎn)潔的實(shí)現(xiàn)。
有了這個(gè)超簡(jiǎn)潔的實(shí)現(xiàn),下一步就是實(shí)現(xiàn)像jQuery的each方法一樣的return true代表break和return false代表continue的功能了,只有具備了這樣的功能,才能處理無(wú)窮集,或是實(shí)現(xiàn)TakeWhile之類的功能。
老實(shí)說(shuō)我對(duì)JavaScript的研究并不透徹,只想到了一個(gè)使用異常打斷的辦法,這就是第二個(gè)版本的yieldHost:
復(fù)制代碼 代碼如下:
function yieldHost(yieldFunction)
{
var exception = Math.random();
return function (processer)
{
try
{
yieldFunction(function (result)
{
if (processer(result))
throw exception;
});
}
catch (e)
{
if (e !== exception)
throw e;
}
};
}

顯然這并不完美,但我實(shí)在想不出更好的辦法。
接下來(lái)在這個(gè)基礎(chǔ)上實(shí)現(xiàn)Select、Where什么,其實(shí)是非常簡(jiǎn)單的事情,給出一個(gè)我的Select的實(shí)現(xiàn):
復(fù)制代碼 代碼如下:
function Select(enumerator, selector)
{
return function (fun)
{
enumerator(function (item)
{
return fun(selector(item));
});
}
}

至于,這個(gè)Select怎么修改成連寫(xiě)的版本,即:
enumerator.Select( selector )( processor );
我覺(jué)得這對(duì)JavaScript而言真不是一件很難的事情啊。。。。
只是,過(guò)早的引入語(yǔ)法友好,會(huì)把JavaScript變得很復(fù)雜難看。所以,這個(gè)留給大家去玩吧。

JavaScript技術(shù)JavaScript中yield實(shí)用簡(jiǎn)潔實(shí)現(xiàn)方式,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 核舟记课堂笔记| 轨迹地图| 舌吻小视频| 中国汉字大全20000个| 罗中立的《父亲》详案| 大空头 电影| 郑楚一| 爱情电影片| 女医生韩国| 女同恋性吃奶舌吻完整版| 毕业论文3000字范文| 爱在线观看| 麦德罗| soul电影| 张国立主演电视剧全剧大全免费观看| 丁丁历险记电影| 欧美gv网站| 红灯区1996| 《白蛇传说》| 舞法天女之绚彩归来演员表| 《眷恋》电影在线观看免费| 奈哈·西贡索邦| 东方卫视节目表| 萱草花合唱谱二声部| 麻美由真电影| kaylani lei| 狼来了电影免费观看| 永远的乳房 电影| 生产时直拍宫口| 周秀娜与罗仲谦新婚吻戏合集| 1—42集分集剧情简介| 男操女视频免费| 去有风的地方| cctv体育频道5| 《满意度》电影免费观看| 盒饭餐盒图片| 风云雄霸天下| 教师政治学习笔记| 宝宝满月酒微信邀请函| 李采禫的电影| 国家励志奖学金个人主要事迹1500字|