好的,所以我有一个对象,我想将回调函数应用于对象中的所有方法。这是我到目前为止所尝试的:
var namespace = {
foo : 'bar',
foobar : function() { console.log('call from foobar!')},
someFunc : function() { console.log('call from someFunc!')},
someFunc2 : function() { console.log('call from someFunc2!')}
}
var logger = {
_callback : function () {
console.log('call from logger!',arguments);
}
}
for (var m in namespace) {
if ( namespace.hasOwnProperty(m) && (typeof namespace[m]=='function') ) {
logger[m] = namespace[m];
namespace[m] = function() {
logger._callback(arguments);
logger[m].apply(this, arguments);
}
}
}
namespace.foobar('foo');
namespace.someFunc('bar');
namespace.someFunc2('bar2');
这是登录到控制台的内容:
call from logger! [["foo"]]
call from someFunc2!
call from logger! [["bar"]]
call from someFunc2!
call from logger! [["bar2"]]
call from someFunc2!
正如您所看到的,由于某种原因,namespace
的所有3种方法都输出'call from someFunc2!
这是错误的。我不确定这里的问题是什么。我做错了什么?
答案 0 :(得分:5)
只有一个“m”。您在for
循环中创建的函数内部的代码引用“m”的“实时”值,而不是在创建函数时冻结的值。它所采用的最后一个值是名称“someFunc2”,因此这就是被调用的值。
一步一步:
答案 1 :(得分:5)
尝试
for (var m in namespace) {
if ( namespace.hasOwnProperty(m) && (typeof namespace[m]=='function') ) {
logger[m] = namespace[m];
(function(index){
namespace[index] = function() {
logger._callback(arguments);
logger[index].apply(this, arguments);
};
})(m);
}
}
否则namespace[m] = function(){}
将使用m是最后一个