在包装函数中添加日志

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);