You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript多函数引用指向同一实现时如何获取当前调用名

问题场景

编写了工厂函数demo,返回对象包含tiger、lion、dog三个属性,三个属性都指向内部定义的同一个trigger方法,可通过demo.tiger()、demo.lion()、demo.dog()三种方式触发trigger执行。现在需要在trigger内部获取本次调用使用的方法名,比如执行demo.tiger('Hello', {1:1})时,能在trigger内拿到对应的名称tiger。

初始实现代码:

const demo = ({ }) => {
    function trigger (message, context) {
        console.log(message, context);
    }

    return {
        tiger: trigger,
        lion: trigger,
        dog: trigger
    }
}
实现方案

不要直接把同一个trigger引用赋值给三个对外属性,给每个暴露的方法加一层轻量包装,调用时把方法名作为参数透传给内部trigger即可,修改后代码:

const demo = ({ }) => {
    function trigger (callMethod, message, context) {
        console.log('本次调用方法:', callMethod);
        console.log('传入参数:', message, context);
        // 原有trigger的业务逻辑写在这里
    }

    return {
        tiger: (message, context) => trigger('tiger', message, context),
        lion: (message, context) => trigger('lion', message, context),
        dog: (message, context) => trigger('dog', message, context)
    }
}

如果后续要新增更多同类方法,不想重复写包装代码,可以批量生成返回的方法对象:

const demo = ({ }) => {
    function trigger (callMethod, message, context) {
        console.log('本次调用方法:', callMethod);
        console.log('传入参数:', message, context);
    }

    const methodNames = ['tiger', 'lion', 'dog'];
    return methodNames.reduce((res, name) => {
        res[name] = (message, context) => trigger(name, message, context);
        return res;
    }, {});
}

效果验证

执行demo.tiger('Hello', {1:1}),控制台输出:

本次调用方法: tiger
传入参数: Hello { '1': 1 }

执行demo.lion('Hi', {a: 2})时会自动识别到方法名lion,符合预期。

不建议使用arguments.callee、依赖this溯源的方式获取方法名:arguments.callee在严格模式下被禁用,依赖this的方案在方法被解构、赋值给其他变量调用时会出现识别错误,稳定性远不如显式传参的方案。

内容的提问来源于stack exchange,提问作者tbowden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:42:15