我创建了一个函数包装器来帮助我提供各种打印语句:

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呼叫addadd2也只呼叫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);

Javascript相关问答推荐

我不知道为什么我的JavaScript没有验证我的表单

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

提交表格后保留Web表格中的收件箱值?

node TS:JWT令牌签名以验证客户端和后台问题之间的身份验证

将2D数组转换为图形

使用i18next在React中不重新加载翻译动态数据的问题

为什么promise对js中的错误有一个奇怪的优先级?

配置WebAssembly/Emscripten本地生成问题

setcallback是什么时候放到macrotask队列上的?

如何调用名称在字符串中的实例方法?

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

在open shadow—root中匹配时,使用jQuery删除一个封闭的div类

如何使onPaste事件与可拖动的HTML元素一起工作?

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

在HTML语言中调用外部JavaScript文件中的函数

本地库中的chartjs-4.4.2和chartjs-plugin-注解

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

在GraphQL解析器中修改上下文值

对不同目录中的Angular material 表列进行排序