我想围绕jQuery函数创建一个日志装饰器,但它只被调用一次(在初始化时)。怎么解决?请查看代码。
function makeLogging(f) {
function wrapper(...rest) {
console.log(f.name);
console.log(rest);
return f.apply(this, rest);
}
return wrapper;
}
const task = $('.task');
task.on = makeLogging(task.on);
task.on('click', () => console.log('hi'));
click事件不会显示有关被调用函数的消息。
答案 0 :(得分:1)
如果我抓住了你想要实现的想法,你这样做有点不对劲。对于您描述的功能,请尝试以下操作:
task.on('click', makeLogging(() => console.log('hi')));
在原始代码中,您包含了on()
函数的功能,但此on()
函数未被调用为事件处理程序 - 它只安装实际的事件处理程序。这就是为什么在安装处理程序期间只调用一次日志记录。
答案 1 :(得分:0)
答案的代码示例
function makeLogging(f) {
function auxiliaryWrapper(x, rest) {
return () => {
console.log(f.name);
console.log(rest);
x();
}
}
function mainWrapper(...rest) {
const restWithWrap = rest.map(arg => {
if (typeof arg === 'function') {
return auxiliaryWrapper(arg,rest);
}
return arg;
});
console.log(restWithWrap);
return f.apply(this, restWithWrap);
}
return mainWrapper;
}
const task = $('.task');
task.on = makeLogging(task.on);
task.on('click', () => console.log('hi'));