JavaScript中如何将传入函数的实参变量名转换为字符串
问题原因
你当前的代码无法返回预期结果,核心原因是JavaScript的参数是值传递的:当你调用transformVarName(newFn)时,函数内部的形参variable只会拿到newFn存储的值'something',完全不会保留这个值在外部绑定的变量名newFn。
你在函数内写的{variable}是对象属性简写语法,等价于{ variable: variable },这里的属性键固定是你定义的形参名variable,所以Object.keys拿到的结果自然是['variable']。
JavaScript本身没有提供原生API,可以在函数内部直接获取调用时传入实参对应的外部变量名,需要调整调用和书写方式实现需求。
推荐实现方案
最稳妥、无副作用、适配所有作用域的方案是:调用时用对象简写语法把目标变量包裹成对象传入,函数内部取对象的第一个键名即可。
const newFn = 'something'; const transformVarName = (varWrapper) => { return Object.keys(varWrapper)[0]; }; // 调用时将目标变量包裹在对象中传入 console.log(transformVarName({newFn})) // 输出: 'newFn',符合预期
这个方案的原理是,当你写{newFn}时,对象属性简写会自动以变量名newFn作为键,变量值作为属性值,函数只需要读取传入对象的键名就能拿到原始变量名字符串,不管变量是全局、块级还是函数作用域声明的都能正常工作。
不推荐的实现方式(仅作了解)
如果目标变量是全局作用域声明的,理论上可以通过遍历全局对象(浏览器环境是window,通用环境是globalThis)匹配对应值拿到变量名,但这个方案存在致命缺陷,绝对不要在生产环境使用:
- 块级作用域、函数作用域内用
let/const声明的变量不会挂载到全局对象,完全无法匹配 - 如果多个变量存储了相同的值,会返回第一个遍历到的属性名,结果完全不可控
- 遍历全局对象性能差,还可能匹配到无关的内置属性
反面示例代码:
// 反面示例,禁止生产环境使用 const newFn = 'something'; const transformVarName = (val) => { for (const key in window) { if (window[key] === val) return key; } }; console.log(transformVarName(newFn)) // 偶现返回'newFn',结果不可靠
内容的提问来源于stack exchange,提问作者Cherniugov Yevgenii
相关产品推荐
相关产品推荐

