JavaScript中如何获取函数传入参数对应的原始变量名?
核心限制说明
JavaScript 函数调用时仅传递变量对应的值(原始类型传值拷贝,引用类型传地址拷贝),运行时不会保留原始变量名的上下文信息,因此无法直接通过参数本身拿到传入变量的原始名称。你之前找到的方案仅能读取函数形参的定义名,自然只能返回"variable"。
最优实现方案(推荐)
仅需修改调用逻辑,利用 ES6 对象字面量简写特性传递变量,无需其他侵入性改造,稳定兼容所有现代环境:
let fooVar = 3; let barVar = "hello World"; function doStuff(variableObj) { const varName = Object.keys(variableObj)[0]; const value = variableObj[varName]; return `${varName}: ${value}`; } document.write(doStuff({fooVar})); // 输出 "fooVar: 3" document.write(doStuff({barVar})); // 输出 "barVar: hello World"
特殊场景hack方案(仅适合调试用,禁止生产环境使用)
如果不想修改调用方式,可以通过解析调用栈字符串匹配变量名,该方案缺陷极多:代码压缩后失效、传表达式会匹配错误、换行写调用会失效、不同浏览器栈格式不同可能匹配失败:
let fooVar = 3; let barVar = "hello World"; function doStuff(variable) { const stackStr = new Error().stack.split('\n')[2]; const matchRes = stackStr.match(/doStuff\((\w+)\)/); const varName = matchRes ? matchRes[1] : 'unknown'; return `${varName}: ${variable}`; } document.write(doStuff(fooVar)); // 未压缩场景下输出 "fooVar: 3"
关于你提到的替代思路的实现
JavaScript 原生没有提供let/const变量声明的监听钩子,你可以通过Proxy代理对象实现类似效果,需要将所有变量挂载到代理对象上声明:
const varMap = new Map(); // 代理对象,设置属性时自动存入映射表 const varHost = new Proxy({}, { set(target, prop, value) { target[prop] = value; varMap.set(value, prop); return true; } }); // 变量声明必须走代理对象 varHost.fooVar = 3; varHost.barVar = "hello World"; function doStuff(variable) { const varName = varMap.get(variable) || 'unknown'; return `${varName}: ${variable}`; } document.write(doStuff(varHost.fooVar)); // 输出 "fooVar: 3" document.write(doStuff(varHost.barVar)); // 输出 "barVar: hello World"
该方案的缺陷是:所有变量不能直接用let/const声明,且如果多个变量值相同,映射表会出现覆盖问题。
内容的提问来源于stack exchange,提问作者Kjara
相关产品推荐
相关产品推荐

