小議JavaScript中Generator和Iterator的使用
一說(shuō)到 Generator,大家就會(huì)扯上異步之類是話題。這顯然是被一些奇奇怪怪的東西帶壞了。與 Generator 關(guān)系密切的應(yīng)該是 Iterator 才對(duì),拿 Generator 來(lái)處理異步也許是一些 C# 程序員才會(huì)想的事。當(dāng)然這種用法確實(shí)有一套完整的東西,只是我個(gè)人不喜歡而已。
非要把 Generator 和異步聯(lián)系上,唯一的點(diǎn)就是 next 的調(diào)用時(shí)機(jī)。因?yàn)?next 可以異步地調(diào)用,所以 Generator 才得以被異步地濫用。
但我覺(jué)得 next 這個(gè)方法雖然可以異步調(diào)用,但正確的使用方式應(yīng)該是同步的。至少當(dāng)一個(gè) Generator 實(shí)例被用于 for-of 循環(huán)或 [...obj] 解構(gòu)時(shí)都是連續(xù)調(diào)用 next 的。
除了 next 的同異步問(wèn)題外,next 的參數(shù)也是個(gè)問(wèn)題。由于 next 調(diào)用時(shí)傳入的參數(shù)會(huì)被作為 yield 運(yùn)算符的返回值,所以 generator 有了更豐富的使用方式。在早期的 python 中 yield 是語(yǔ)句而不是運(yùn)算符,所以也不存在這樣的用法。后來(lái)的版本才把 yield 作為運(yùn)算符,所以才出現(xiàn)了各種坑。
把 Generator 實(shí)例作為 Iterator 時(shí)既不會(huì)異步調(diào)用 next,也不會(huì)給 next 傳入?yún)?shù)。我覺(jué)得這才是 Generator 的正確用法?;蛘哒f(shuō)白了,Generator 就是用來(lái)實(shí)現(xiàn) Iterator 的。至少 Generator 這個(gè)名字沒(méi)有別的含義了。下面是一個(gè)用法示例:
運(yùn)行
<script> var match = function * (pattern, string) { var regexp = new RegExp(pattern, 'g'); for(let i; i = regexp.exec(string); yield i); }; for(let i of match('a', 'abcabcabc')) { console.log(i); } </script>
相關(guān)文章
簡(jiǎn)介JavaScript中toTimeString()方法的使用
這篇文章主要介紹了簡(jiǎn)介JavaScript中toTimeString()方法的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06WiFi開(kāi)發(fā)|WiFi無(wú)線技術(shù)介紹
本文通過(guò)介紹WiFi無(wú)線技術(shù)來(lái)達(dá)成一種網(wǎng)絡(luò)延申目的,具體知識(shí)點(diǎn)請(qǐng)看下文2021-08-08JavaScript Math.floor方法(對(duì)數(shù)值向下取整)
這篇文章主要介紹了Math.floor 方法用于對(duì)數(shù)值向下取整,即得到小于或等于該數(shù)值的最大整數(shù),需要的朋友可以參考下2015-01-01深入理解JavaScript系列(49):Function模式(上篇)
這篇文章主要介紹了深入理解JavaScript系列(49):Function模式(上篇),本文講解了回調(diào)函數(shù)、配置對(duì)象、返回函數(shù)、偏應(yīng)用、Currying等內(nèi)容,需要的朋友可以參考下2015-03-03IE網(wǎng)頁(yè)js語(yǔ)法錯(cuò)誤2行字符1、FF中正常的解決方法
使用模態(tài)窗體則會(huì)先彈出此錯(cuò)誤然后再顯示新打開(kāi)的界面,經(jīng)搜索找到不錯(cuò)的解決方法,有類似問(wèn)題的朋友可以參考下,希望對(duì)大家有所幫助2013-09-09分析Node.js connect ECONNREFUSED錯(cuò)誤
最近在準(zhǔn)備Angularjs +node.js demo的時(shí)候在我的mac開(kāi)發(fā)中 遇見(jiàn)此錯(cuò)誤2013-04-04