好的,所以我有一个对象,我想将回调函数应用于对象中的所有方法.这是我到目前为止所尝试的:
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');
Run Code Online (Sandbox Code Playgroud)
这是登录到控制台的内容:
call from logger! [["foo"]]
call from someFunc2!
call from logger! [["bar"]]
call from someFunc2!
call from logger! [["bar2"]]
call from someFunc2!
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,由于某种原因,所有3种namespace输出方法都是'call from someFunc2! 错误的.我不确定这里的问题是什么.我做错了什么?
只有一个"米".您在for循环中创建的函数内部的代码引用"实时"值"m",而不是在创建函数时冻结的值.它所采用的最后一个值是名称"someFunc2",因此这是被调用的值.
一步步:
尝试
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);
}
}
Run Code Online (Sandbox Code Playgroud)
否则namespace[m] = function(){}将使用m是最后一个
| 归档时间: |
|
| 查看次数: |
44 次 |
| 最近记录: |