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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:27:16