获取变量名称。 javascript“反思”

有没有办法获得变量名称 ,就像你可以用.Net做reflection?
像在这种情况下:

function(x,y,z) { if (x === 0) logger.log('variable ' + x.reflectedName ' has invalid value ' + x) // logs: 'variable x has invalid value 0) ... } 

我发现类似的问题需要函数外的var名称(?!)但是找不到这个问题。

(jQuery是一个选项,但我无法想象如何用它来完成…)

由于您使用.NET作为示例,让我们简要介绍一下。 在C#中 ,您可以创建一个带有Expression的函数:

 void BadArgument(Expression> argExpr) { } 

但是为了能够从对此函数的调用中提取变量名,您必须确保调用始终使用完全正确的语法(即使在编译时无法强制执行此操作):

 if(x < 0) BadArgument(() => x); 

所以它可以做到,但它非常脆弱而且很慢。 您基本上生成了基于lambda表达式() => x创建整个表达式树的指令,因此您调用的函数可以解析该表达式树并尝试查找参数的名称。

这种事可以在javascript中完成吗? 当然!

在javascript中,闭包是通过内部函数生成的,因此上述lambda表达式的等价物将是:

 function(){return x;} 

由于javascript是一种脚本语言,因此每个函数都等同于它自己的字符串定义。 换句话说,在上面的函数上调用.toString()将产生:

 function(){return x;} 

这个jsfiddle展示了如何在日志记录式函数中利用它。 然后,您可以自由地解析生成的函数字符串,这将比解析.NET表达式树稍微麻烦一点。 此外,获取x的实际比在.NET中更容易:您只需调用该函数 !

但仅仅因为你做到并不意味着你应该这样做。 这是一个很好的作为一个gee-whiz客厅的技巧,但当它来到它,它是不值得的:

  • 它很脆弱:如果某些开发人员没有正确使用它并为您提供一个无法解析的function,该怎么办?
  • 它不适用于缩小:想象得到一个消息,即变量a的值不正确,因为缩小的函数改变了变量名。
  • 它增加了开销:即使缩小器也不能将function(){return x;}缩短为小于"x"
  • 最后,它很复杂。 ‘努夫说。

其实你可以。 这是一个片段:

 function getVarName(v) { for (var key in window) { if (window[key] === v) return key; } } var testvar = 13142; function test(t) { var varName = getVarName(t); // window[varName] -- your variable actualy alert(varName); } test(testvar); // testvar 

另一个问题是如果您创建一些包含相同变量的变量。 然后将返回第一个var。

你不能。 但是既然你已经知道了变量名(因为你必须使用它来将它连接到字符串的末尾),为什么不直接输入呢?

即:

 logger.log('variable x has invalid value '+x); 

获取变量名很容易

 //This is variable you want to get the name var prop; var obj = {prop}; for(var propName in obj){ alert(propName); break; } 

你也可以试试这里 。

编辑

感谢@Brady的评论

Object.keys({variableName})[0]将为您提供变量名称。

 function(x,y) { const key = (obj) => Object.keys(obj)[0]; if (x === 0) logger.log('variable ' + key({x}) + ' has invalid value ' + x) // logs: 'variable x has invalid value 0) if (y === 0) logger.log('variable ' + key({y}) + ' has invalid value ' + y) // logs: 'variable y has invalid value 0) }