在包装函数中添加日志
Adding logs within a wrapped function
我创建了一个函数包装器来帮助我提供各种打印语句:
function fnWrapper(fn, verbosity=false) {
return function(...rest) {
if (verbosity) console.log(`Calling "${fn.name}(${rest})"`)
const res = fn(...rest); // possible to add debugging **within** this wrapped function?
if (verbosity) console.log('==>', res)
return res;
}
}
function add(x,y) {
return x===0 ? y : add(x-1, y+1);
}
const add2 = fnWrapper(add, true);
add2(2,3);
// Calling "add(2,3)"
// ==> 5
是否可以在函数本身内添加调试,例如,最基本的翻译如下函数:
function something(x,y) {
console.log(arguments); // add this in
...
}
所以对于上面的函数,它会使 add
变成:
function add(x,y) {
console.log(arguments);
return x===0 ? y : add(x-1, y+1);
}
如果可以,那怎么办?
不,这是不可能的,你不能改变函数的作用。
问题是 add
调用了 add
,而 add2
也只调用了 add
。但是,您可以简单地 replace add
:
function fnWrapper(fn, verbosity=false) {
return function(...rest) {
if (verbosity) console.log(`Calling "${fn.name}(${rest})"`)
const res = fn.call(this, ...rest);
if (verbosity) console.log('==>', res)
return res;
}
}
function add(x,y) {
return x===0 ? y : add(x-1, y+1);
}
add = fnWrapper(add, true); /*
^^^ */
add(2,3);
我创建了一个函数包装器来帮助我提供各种打印语句:
function fnWrapper(fn, verbosity=false) {
return function(...rest) {
if (verbosity) console.log(`Calling "${fn.name}(${rest})"`)
const res = fn(...rest); // possible to add debugging **within** this wrapped function?
if (verbosity) console.log('==>', res)
return res;
}
}
function add(x,y) {
return x===0 ? y : add(x-1, y+1);
}
const add2 = fnWrapper(add, true);
add2(2,3);
// Calling "add(2,3)"
// ==> 5
是否可以在函数本身内添加调试,例如,最基本的翻译如下函数:
function something(x,y) {
console.log(arguments); // add this in
...
}
所以对于上面的函数,它会使 add
变成:
function add(x,y) {
console.log(arguments);
return x===0 ? y : add(x-1, y+1);
}
如果可以,那怎么办?
不,这是不可能的,你不能改变函数的作用。
问题是 add
调用了 add
,而 add2
也只调用了 add
。但是,您可以简单地 replace add
:
function fnWrapper(fn, verbosity=false) {
return function(...rest) {
if (verbosity) console.log(`Calling "${fn.name}(${rest})"`)
const res = fn.call(this, ...rest);
if (verbosity) console.log('==>', res)
return res;
}
}
function add(x,y) {
return x===0 ? y : add(x-1, y+1);
}
add = fnWrapper(add, true); /*
^^^ */
add(2,3);