首先我們了解一下什么是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