Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取变量名。javascript";“反思”;_Javascript_Jquery_.net_Reflection - Fatal编程技术网

获取变量名。javascript";“反思”;

获取变量名。javascript";“反思”;,javascript,jquery,.net,reflection,Javascript,Jquery,.net,Reflection,有没有一种方法可以像在.Net中使用反射一样获取变量名 就像在这个场景中: function(x,y,z) { if (x === 0) logger.log('variable ' + x.reflectedName ' has invalid value ' + x) // logs: 'variable x has invalid value 0) ... } 我发现了类似的问题,希望在函数(?)之外使用var的名称,但找不到这个问题 (j

有没有一种方法可以像在.Net中使用反射一样获取变量名 就像在这个场景中:

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#中,您可以创建一个采用
表达式的函数:

void BadArgument<T>(Expression<Func<T>> argExpr)
{
}
由于javascript是一种脚本语言,每个函数都相当于它自己的字符串定义。换句话说,对上述函数调用
.toString()
,将产生:

function(){return x;}
如何在日志样式函数中利用这一点。然后,您可以自由地解析生成的函数字符串,这将比解析.NET表达式树稍微麻烦一些。此外,获得
x
的实际值甚至比在.NET中更容易:你只需要

但仅仅因为你能做到这一点并不意味着你就应该做到。这是一个很好的极客客厅把戏,但当它直接涉及到它时,它是不值得的:

  • 它是脆弱的:如果某个开发人员没有正确使用它,给了您一个无法解析的函数,该怎么办
  • 它不适用于缩小:想象一下,收到一条消息,变量
    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

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

很容易获得变量名

//This is variable you want to get the name
var prop;

var obj = {prop};
for(var propName in obj){
  alert(propName);
  break;
}
你也可以试一试

编辑

谢谢你的评论@Brady

对象。键({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)
}

值得指出的是:您无法通过.NET中的反射获取变量名。为什么不将变量名记录在字符串中?在您的示例中,将x放入字符串
console.log('变量x的值无效:',x)
@SpYk3HH同样容易。一个原因是,如果我将
x
变量名更改为
foo
,我就不需要将所有这些字符串更改为
foo
,但是您仍然需要更改变量调用,这不是一样吗?@SpYk3HH。当变量名为
foo
时,调用
x
将产生错误。log
“变量x的值无效”
不会。我认为这个例子是为了简单起见。我假设OP希望在变量名事先未知的情况下执行此操作。但是+1表示“你不能”。如果有人用自己的变量调用函数:
function(a,b,c)
x
对他们来说毫无意义。@gdoron,你必须在这两个地方都更改它们。如果有某种反射方法,那么
x.variable\u name==“x”
总是正确的。因此,
如果(x===0)echo“x是0”
有两个地方可以更改它,如果(x===0)echo x.variable_name+“是0”
也有两个地方可以更改。
如果(x==0)echo x.variable_name+“是0”
。事先不知道它的例子是一个简单的变量记录器
函数logVar(value){console.log('variable',value.name',has value',value)}
,但是是的,答案是这不可能做到。请注意,对于函数,您可以这样做
function logFunctionContents(fn){console.log('function',fn.name',has content',fn.toSource())}
如果您想使用
var name=x.variable\u name
提前缓存它,只需执行
var name='x'
。无论你在什么地方做
x.variable\u name
,只要把字面意思改为
“x”
,它就会以完全相同的方式工作。太棒了!我不会按照你的建议使用它,但这是一个极好的答案!顺便问一下,你会用什么正则表达式从
函数(){return x;}
中得到
x
?@gdoron:我不知道我是否会使用regex。基本上,您只需要在“return”之后和“}”之前获取所有内容,去掉任何空格或分号,并快速祈祷调用代码不会抛出曲线球。小心!缩小*.js文件时,请注意缩小,变量名称可能会更改@gdoron@ImanMahmoudinasab:我已经提到这是不使用这种方法的第二个原因。
var testvar=13142;var testvar2=13142
var testvar=true或任何物体都会毁了你的一天。任何未在windows全局范围内定义的内容也会毁了你的一天。我认为你没有这个问题。再次阅读其他答案或问题。实际上,我认为这确实回答了这个问题,是一个聪明的方法。在这里,使用变量名作为属性名,将变量包装在外部对象中。然后获取对象的第一个属性,即名称。这可以简化为:
Object.keys({prop})[0]
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
//This is variable you want to get the name
var prop;

var obj = {prop};
for(var propName in obj){
  alert(propName);
  break;
}
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)
}