JavaScript中的Array.prototype.forEach
一、jQuery中的迭代器
$.each([1, 2, 3], function(i, n) {  console.log("當前下標為:"+ i + " 當前元素為:"+ n );});二、實現自己的迭代器
var each = function(ary, callback) {  for(var i = 0, l = ary.length; i < l; i++) {    callback.call(ary[i], i, ary[i]);  }  };each([1, 2, 3], function(i, n) {  console.log("當前下標為:"+ i + " 當前元素為:"+ n );});注意:區別于Array.prototype.forEach的參數!!!
[1, 2, 3].forEach(function(n, i, curAry){  console.log("當前下標為:"+ i + " 當前元素為:"+ n + " 當前數組為:" + curAry);})三、內部迭代器、外部迭代器
(1)內部迭代器:已經定義好了迭代規則,它完全接手整個迭代過程,外部只需一次初始調用。上述自定義each即為內部迭代器! 
(2)外部迭代器:必須顯示地請求迭代下一個元素。 
示例:判斷兩個數組是否相等
示例一:內部迭代器
// 內部迭代器var each = function(ary, callback) {  for(var i = 0, l = ary.length; i < l; i++) {    callback.call(ary[i], i, ary[i]);  }  };// 比較函數var compareAry = function(ary1, ary2) {  if(ary1.length != ary2.length) {    throw new Error("不相等"); // return console.log("不相等");   }  // 且住  each(ary1, function(i, n) {    if(n !== ary2[i]) {      // return console.log("不相等");       // return 只能返回到each方法外,后續console.log("相等")會繼續執行,所以這里得使用throw      throw new Error("不相等");    }  });  console.log("相等");}compareAry([1, 2, 3], [1, 2, 4]);示例二:外部迭代器
// 外部迭代器var Iterator = function(obj) {  var current = 0,    next = function() {      current++;    },    isDone = function() {      return current >= obj.length;      },    getCurrentItem = function() {      return obj[current];    };  return {    next: next,    isDone: isDone,    getCurrentItem: getCurrentItem  };};// 比較函數var compareAry = function(iterator1, iterator2) {  while( !iterator1.isDone() && !iterator2.isDone() ){    if(iterator1.getCurrentItem() !== iterator2.getCurrentItem()) {      throw new Error("不相等");    }    iterator1.next();    iterator2.next();  }  console.log("相等");}compareAry(new Iterator([1, 2, 3]), new Iterator([1, 2, 4]));四、終止迭代器
var each = function(ary, callback) {  for(var i = 0, l = ary.length; i < l; i++) {    if(callback.call(ary[i], i, ary[i]) === false) {      break;    }  }}each([1, 2, 4, 1], function(i, n) {  if(n > 3) {    return false;  }  console.log(n);});五、應用(落地)
文件上傳,根據不同的瀏覽器獲取相應的上傳組件對象。 
對比《JavaScript設計模式
主站蜘蛛池模板:
宝丰县|
宜昌市|
濮阳市|
屯昌县|
隆子县|
正镶白旗|
德兴市|
华容县|
临泽县|
蒙山县|
那坡县|
铁力市|
乳山市|
德令哈市|
武邑县|
盐山县|
祁连县|
乳源|
紫阳县|
乌苏市|
南召县|
新乡县|
长阳|
景德镇市|
呼图壁县|
旬邑县|
南康市|
西青区|
郎溪县|
称多县|
通化市|
亚东县|
余干县|
乐山市|
子洲县|
云林县|
邵东县|
瑞安市|
仁布县|
鄂伦春自治旗|
西丰县|