使用JavaScript获取变量名称

9

我想创建一个日志函数,可以像这样插入变量名称:

var a = '123',
    b = 'abc';

log([a, b]);

在控制台中输出应该如下所示
a: 123
b: abc

获取变量的值没有问题,但我如何获取变量名?该函数应该是通用的,因此我不能总是假设作用域是window。


4
这在Javascript中不可能按照你想要的方式工作。使用类似 var foo = bar = {} 的语法,同一个对象被两个名称引用,如果你只是将该对象传递到函数中,那么在函数内部无法反向查找并确定传递时所使用的名称。 - Gareth
好的,那我可以停止搜索了。谢谢! - arpo
相反,你应该学习如何使用调试器。首先,将一行代码改成只包含“debugger”而不是“console.log”,然后在打开Firebug或Chrome Inspector的情况下运行你的代码。 - Gareth
1
如何在JavaScript中将变量名转换为字符串?的确切副本。 - Dan Dascalescu
7个回答

6
所以参数是一个变量数组吗?那么,一旦传递这种方式,就没有办法获得原始的变量名称。在接收端,它们只是看起来像这样:
["123","abc"];

仅仅如此


您可以向该函数提供变量的名称和它们所在的作用域,例如:

function log(arr,scope){
    for(var i=0;i<arr.length;i++){
        console.log(arr[i]+':'scope[arr[i]]);
    }
}

然而,如果你也能提供作用域,这将是一个问题。在某些代码区域中,“this”指向会产生很多问题:
- 对于非严格函数,“this”指向“window”。 - 对于严格函数,“this”指向“undefined”。 - 对于构造函数,“this”指向已构造的对象。 - 在对象字面量中,“this”指向最近的封闭对象。
因此,你不能依赖传递“this”作为作用域。除非你能提供作用域,否则这是另一条死路。
如果你将它们作为对象传递,那么就可以遍历对象及其“键”,而不是原始变量名。然而,在这种情况下,这样做可能会带来更多的伤害。

2

我知道你想节省一些按键。我也是。然而,我通常会像其他人建议的那样记录变量名称和值。

console.log({a:a, b:b});

如果您真的喜欢您已经说明的格式,那么你可以这样做:
function log(o) {
    var key;
    for (key in o) {
        console.log(key + ":", o[key]);
    }
}

var a = '1243';
var b = 'qwre';
log({
    a:a,
    b:b
});

无论哪种方式,如果您想看到变量名,都需要在日志请求中包含变量名。就像Gareth所说的那样,在调用函数内部看到变量名是不可能的。

是的,那可能是我能做到的最接近的了。 - arpo

1

像这样的代码可以实现你所需要的功能:

function log(logDict) {
    for (var item in logDict) {
        console.log(item + ": " + logDict[item]);
    }
}

function logSomeStuff() {
    var dict = {};
    dict.a = "123";
    dict.b = "abc";
    log(dict);
}

logSomeStuff();

我知道我可以使用一个对象。但我想要做的是在工作时节省按键次数。我想快速查看一堆变量的值。如果我必须把它们放到一个对象中,那么我会得到另一种类型的按键操作 :) 我已经厌倦了输入console.log('a: ' + a ' b: ' + b);,我想要一个函数来处理这个问题。 - arpo
在这种情况下,您会遇到@Joseph在他的答案中提到的与作用域相关的问题。 - Ivan Karajas

0

我曾经遇到过类似的问题,但原因不同。

我找到的最佳解决方案是:

MyArray = ["zero","one","two","three","four","five"]; 
MyArray.name="MyArray";

所以如果:

x=MyArray.name;

然后:

X=="MyArray"

就像我说的,它适合我的需求,但不确定它对你有何作用。 我感到很傻,因为我甚至需要它,但我确实需要。


0

不知道这个在JS中是否真的可行...但是你可以使用一个对象,其中你可以存储名称和值:

  function MyLogObject(name, value) {
    this.name = name;
    this.value = value;
  }


  var log = [];
  log.push(new MyLogObject('a', '123'));
  log.push(new MyLogObject('b', 'abc'));

  for each (var item in log) {
    if (item.value != undefined)
      alert(item.name + "/" + item.value);       
  }

然后您可以循环遍历此对象,以获取名称和值


不,一个对象不是我要找的。 - arpo

0
你不能使用数组来访问变量名。你可以使用对象或将变量名作为字符串传递:
var x = 7;
var y = 8;

function logVars(arr){
    for(var i = 0; i < arr.length; i++){
        alert(arr[i] + " = " + window[arr[i]]);
    }
}

logVars(["x","y"]);

“该函数应该是通用的,所以我不能总是假设作用域是 window。”OP说道。 - Joseph
我知道数组和对象是如何工作的。但我想要节省按键次数,可以参考上面的答案。而且我不能假设作用域是 window。事实上,我尽可能少使用 window 作用域。 - arpo

-2

测试一下。

var variableA="valor01"; <br>
var variableB="valor02";

var NamevariableA=eval('("variableA")');<br>
var NamevariableB=eval('("variableB")');<br>

console.log(NamevariableA,NamevariableB);

atte. Manuel Retamozo Arrué


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接