获取变量名称.javascript"反思"

gdo*_*ica 6 .net javascript reflection jquery

有没有办法获取变量名称,就像你可以在.Net中使用反射一样?
像在这种情况下:

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

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

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

ovn*_*nia 8

其实你CAN.这是一个片段:

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
Run Code Online (Sandbox Code Playgroud)

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

  • `var testvar = 13142; var testvar2 = 13142;`或`var testvar = true;`或任何对象都会破坏你的一天.Windows全局范围内未定义的任何内容也将毁掉您的一天. (5认同)

Str*_*ior 7

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

void BadArgument<T>(Expression<Func<T>> argExpr)
{
}
Run Code Online (Sandbox Code Playgroud)

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

if(x < 0)
    BadArgument(() => x);
Run Code Online (Sandbox Code Playgroud)

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

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

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

function(){return x;}
Run Code Online (Sandbox Code Playgroud)

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

function(){return x;}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Nie*_*sol 6

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

即:

logger.log('variable x has invalid value '+x);
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个例子是为了简单.我假设OP想要在事先不知道变量名的情况下这样做.但+1为"你不能." (3认同)