有时候回调并不是一次性的匿名函数或全局函数,而是对象的方法。如果该回调方法使用this来引用她所属的对象,这可能会导致意想不到的行为。
1 win.color = "#ffc000"; 2 // 重构findNodes() 以接受一个回调函数 3 var findNodes = function(callback, callback_obj){ 4 var eles = doc.body.getElementsByTagName("*"); 5 var i = eles.length, 6 nodes = [], 7 found; 8 9 // 检查回调函数是否为可调用的 10 if(typeof callback !== "function"){ 11 callback = false; 12 } 13 14 while(i){ 15 i --; 16 // 复杂逻辑 17 18 if(eles[i].nodeType == 1){ 19 found = eles[i]; 20 } 21 22 // 现在运行回调函数 23 if(callback){ 24 callback.call(callback_obj, found); 25 } 26 27 nodes.push(found); 28 } 29 return nodes; 30 }; 31 32 var myapp = {}; 33 myapp.color = "green"; 34 myapp.paint = function(node){ 35 36 node.style.color = this.color; 37 console.log(this); 38 }; 39 // myapp.paint();// "green" 40 41 findNodes(myapp.paint, myapp);