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
相关产品推荐
相关产品推荐

