原生js實現each方法


首先我們了解一下什么是callback函數
CALLBACK,即回調函數,是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。
回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
實現的機制
[1]定義一個回調函數;
[2]提供函數實現的一方在初始化的時候,將回調函數的函數指針注冊給調用者;
[3]當特定的事件或條件發生的時候,調用者使用函數指針調用回調函數對事件進行處理。
使用優點
因為使用此函數可以把調用者與被調用者分開,所以調用者不關心誰是被調用者。它只需知道存在一個具有特定原型和限制條件的被調用函數。簡而言之,回調函數就是允許用戶把需要調用的
函數的指針作為參數傳遞給一個函數,以便該函數在處理相似事件的時候可以靈活的使用不同的方法。
凡是由你設計卻由windows系統呼叫的函數,統稱為callback函數。某些API函數要求以callback作為你參數之一。如SetTimer,LineDDA,EnumObjects。
回調函數是由開發者按照一定的原形進行定義的函數(每個回調函數都必須遵循這個原則來設計)
jquery里面有個each方法,將循環操作簡化、便捷。
隨后es出了個forEach方法,兩個雖然用法相近,但是不能處理對象類型。且無法通過return true達到continue效果。
此外還有個every方法,該方法雖然可以實現continue效果,但是在處理類數組與對象類型時,完全無用。
在不使用jquery的each方法時,該如何處理;或者說用原生如何來實現?
封裝代碼如下

	<div></div>
	<div></div>
	<div></div>
	<div></div>
	<div></div>
	<div></div>
	<div></div>
	<div></div>
	<script>
		// 通過字面量方式實現的函數each
var each =  function(object, callback){
  var type = (function(){
          switch (object.constructor){
            case Object:
                return 'Object';
                break;
            case Array:
                return 'Array';
                break;
            case NodeList:
                return 'NodeList';
                break;
            default:
                return 'null';
                break;
        }
    })();
    // 為數組或類數組時, 返回: index, value
    if(type === 'Array' || type === 'NodeList'){
        // 由於存在類數組NodeList, 所以不能直接調用every方法
        [].every.call(object, function(v, i){
            return callback.call(v, i, v) === false ? false : true;
        });
    }
    // 為對象格式時,返回:key, value
    else if(type === 'Object'){
        for(var i in object){
            if(callback.call(object[i], i, object[i]) === false){
                break;
            }
        }
    }
}
var _array = [1,2,3,4];
each(_array, function(i, v){
  console.log(i + ': ' + v);
});
var object = {a:1, b:2, c:3}
each(object, function(i, v){
  console.log(i + ': ' + v);
});
var ele = document.querySelectorAll('div');
each(ele, function(i, v){
  console.log(i + ': ' + v);
});
var object2 = {name:'baukh', age: '29', six:'男', url: 'www.lovejavascript.com',}
each(object2, function(i, v){
  if(i === 'age'){ //如果存在鍵值為age的屬性時,則輸出警告,用於實現continue效果
    console.log('存在鍵值為age,這家伙已經'+v+'歲了');
    return true;
  }
  if(i === 'six' && v === '男'){//如果存在鍵值為age的屬性時,則輸出跳出,用於實現break效果
    console.log('存在鍵值為six,是個男的,不用關注了~');
    return false;
  }
  console.log(i + ': ' + v);
});
	</script>

從結果可以看出來,each方法已經實現了jquery的each功能。

本文借鑒自:http://www.lovejavascript.com/#!zone/blog/content.html?id=48


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM