获取变量名。javascript";“反思”;
有没有一种方法可以像在.Net中使用反射一样获取变量名 就像在这个场景中:获取变量名。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
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)
}