拆開JavaScript迭代器模式內(nèi)部黑盒子
一、內(nèi)部迭代器
迭代器模式,指的是提供一種方法順序訪問一個聚合對象或者數(shù)組中的各種元素,而又不暴露該對象的內(nèi)部表示。
內(nèi)部迭代器是自動的,將回調(diào)函數(shù)傳入迭代器進(jìn)行執(zhí)行,訪問到每一個元素都會執(zhí)行傳入迭代器中的回調(diào)函數(shù)。
模擬內(nèi)部迭代器如下:
// 定義數(shù)組原型上的mapFn內(nèi)部迭代器
Array.prototype.mapFn = function (callback) {
let arr = this;
let newArr = []
for (let i = 0; i < arr.length; i++) {
newArr[i] = callback(arr[i], i, arr)
}
return newArr
}
// 定義原始數(shù)組
var arr = [1, 2, 3, 4, 5];
// 定義回調(diào)函數(shù)
var callback = val => val * 2;
// 執(zhí)行數(shù)組的mapFn方法調(diào)用回調(diào)函數(shù)callback
var newArr = arr.mapFn(callback);
// 打印返回值
console.log(newArr)
callback函數(shù)可以傳入三個參數(shù),第一個參數(shù)表示當(dāng)前的值,第二個參數(shù)表示當(dāng)前索引,第三個參數(shù)表示正在操作的數(shù)組。返回值為新數(shù)組。
當(dāng)前例子中,callback指的是val => val * 2,通過數(shù)組的mapFn方法執(zhí)行callback函數(shù),返回值為新的數(shù)組newArr。
在實際的使用中,Array.prototype.mapFn的內(nèi)部實現(xiàn)是看不到的,就像我們看不到數(shù)組的操作map和forEach一樣,這里如果將Array.prototype.mapFn作為黑盒子。就有如下的流程:

二、外部迭代器
外部迭代器是非自動的,提供了next方法,需要手動的去執(zhí)行next()以進(jìn)行下一個元素的訪問。
// 定義迭代器生成函數(shù)
function makeIterator(array) {
var nextIndex = 0;
return {
next: function () {
return nextIndex < array.length ? {
value: array[nextIndex++],
done: false
} : {
value: undefined,
done: true
};
}
};
}
// 產(chǎn)生迭代器
var it = makeIterator(['a', 'b']);
// 通過迭代器暴露出來的next方法,外部調(diào)用迭代器
console.log(it.next()) // { "value": "a", "done": false }
console.log(it.next()) // { "value": "b", "done": false }
console.log(it.next()) // { "value": undefined, "done": true }
makeIterator返回next方法,每一次執(zhí)行都會執(zhí)行下一個迭代。done是否迭代結(jié)束,value是當(dāng)前迭代獲取到的值。如果done為true,對應(yīng)的value就是undefined。
在實際的使用中,makeIterator的內(nèi)部實現(xiàn)是看不到的,這里如果將makeIterator作為黑盒子。就有如下的流程:

總結(jié):
目前JavaScript已經(jīng)內(nèi)置了多種內(nèi)部迭代器,比如forEach、map、filter和reduce等,內(nèi)部執(zhí)行回調(diào)函數(shù)function(value, index, currentArr){ xxxx }對每個訪問到的元素進(jìn)行處理。通過generate和yield配合使用也可以產(chǎn)生外部迭代器,通過next()方法進(jìn)行下一步的執(zhí)行。
以上就是拆開JavaScript迭代器模式內(nèi)部黑盒子的詳細(xì)內(nèi)容,更多關(guān)于JavaScript迭代器模式內(nèi)部黑盒子的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript實現(xiàn)非常簡單實用的下拉菜單效果
這篇文章主要介紹了JavaScript實現(xiàn)非常簡單實用的下拉菜單效果,通過定義顯示及隱藏菜單項及鼠標(biāo)事件調(diào)用該函數(shù)實現(xiàn)下拉菜單功能,需要的朋友可以參考下2015-08-08
JavaScript+Canvas實現(xiàn)繪制音頻可視化波形圖
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript和Canvas實現(xiàn)繪制音頻可視化波形圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
基于Web標(biāo)準(zhǔn)的UI組件 — 樹狀菜單(2)
基于Web標(biāo)準(zhǔn)的UI組件 — 樹狀菜單(2)...2006-09-09
JavaScript字符串處理之trim()和replace()詳解
這篇文章主要給大家介紹了關(guān)于JavaScript字符串處理之trim()和replace()的相關(guān)資料,文中介紹的所有這些方法都不會修改原始字符串,而是返回一個新的字符串,需要的朋友可以參考下2024-10-10
控制頁面按鈕在后臺執(zhí)行期間不重復(fù)提交的JS方法
下面的代碼可以避免這種情況的發(fā)生,要等第一次執(zhí)行完返回數(shù)據(jù)到前臺后才能提交第二次。2013-06-06
Canvas實現(xiàn)二娃翠花回家之路小游戲demo解析
這篇文章主要為大家介紹了Canvas實現(xiàn)二娃翠花回家之路小游戲demo解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
js-FCC算法-No repeats please字符串的全排列(詳解)
下面小編就為大家?guī)硪黄猨s-FCC算法-No repeats please字符串的全排列(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

