天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

JavaScript中yield實用簡潔實現方式

剛才忽然靈機一動,迭代器我們很少會真的直接傻乎乎的next去遍歷的,那為什么一定要實現這個傻乎乎的next呢?直接實現each,這樣,這樣反過來,Yeah,一通百通,不一會兒就寫出了第一個超簡潔版本:
復制代碼 代碼如下:
function yieldHost(yieldFunction)
{
return function (processer)
{
var yield = function (result)
{
processer(result)
};
yieldFunction(yield);
};
}

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

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

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

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

所以就誕生了這個超簡潔的實現。
有了這個超簡潔的實現,下一步就是實現像jQuery的each方法一樣的return true代表break和return false代表continue的功能了,只有具備了這樣的功能,才能處理無窮集,或是實現TakeWhile之類的功能。
老實說我對JavaScript的研究并不透徹,只想到了一個使用異常打斷的辦法,這就是第二個版本的yieldHost:
復制代碼 代碼如下:
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;
}
};
}

顯然這并不完美,但我實在想不出更好的辦法。
接下來在這個基礎上實現Select、Where什么,其實是非常簡單的事情,給出一個我的Select的實現:
復制代碼 代碼如下:
function Select(enumerator, selector)
{
return function (fun)
{
enumerator(function (item)
{
return fun(selector(item));
});
}
}

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

JavaScript技術JavaScript中yield實用簡潔實現方式,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 午夜精品久久久久久99热蜜桃 | 国产传媒在线观看 | 亚洲国产精品日本无码网站 | 亚洲bt区 | 国产乱码伦人偷精品视频 | 亚洲视频一区在线 | 免费精品一区二区三区在线观看 | 欧洲精品一区二区不卡观看 | 99re8久久热在线视频 | 妙玉被肉干高H潮文 | 亚洲热在线视频 | 伊人久久免费 | 国产精品麻豆a啊在线观看 国产精品麻豆AV | 香蕉鱼视频观看在线视频下载 | 男女无遮挡吃奶gift动态图 | 99精产国品一二产区在线 | 美女黄图大全 | 好硬好湿好爽再深一点视频 | 在镜头里被CAO翻了H | 日本女人下面毛茸茸 | 文中字幕一区二区三区视频播放 | 伸进同桌奶罩里摸她胸作文 | nxgx69日本护士 | 花蝴蝶高清影视视频在线播放 | 老师你下面好紧夹死了 | 中文字幕伊人香蕉在线 | 国产精品久久久久激情影院 | 国产精品人妻在线观看 | 99国产精品久久人妻无码 | 好男人午夜www视频在线观看 | 哪灬你的鸣巴好大 | 少妇无码太爽了视频在线播放 | 果冻传媒APP免费网站在线观看 | 午夜一区二区三区 | 国产高清亚洲日韩字幕一区 | 亚洲不卡高清免v无码屋 | 色狠狠色狠狠综合天天 | 精品国产免费第一区二区 | 色综合久久久久久 | 国精产品一区二区三区四区糖心 | 亚洲国产在线观看免费视频 |