在传递给函数后确定变量的原始名称

IT技术 javascript
2021-01-11 20:26:29

我有一种感觉,这可能是不可能的,但我想确定已传递给 javascript 函数的变量的原始变量名。我不知道如何更好地解释它,所以看看这个例子是否有意义。

function getVariableName(unknownVariable){
  return unknownVariable.originalName;
}

getVariableName(foo); //returns string "foo";
getVariableName(bar); //returns string "bar";

这是我正在开发的 jquery 插件,我希望能够显示传递给“调试”函数的变量的名称。

6个回答

你是对的,这在任何理智的方式下都是不可能的,因为只有值被传递到函数中。

获取回溯,获取函数调用的文件和行号,加载该文件的源代码,查找并解析该行,尝试找出哪个变量是您的参数。由于一行上可能有任意数量的函数调用,并且函数在运行时可能会产生别名,更不用说任务的复杂性了,我希望这种疯狂是不言而喻的。
2021-03-25 20:26:29
@Perry您当然可以构建非常具体的情况,在这种情况下您可以将值反转为变量名,但这远非可概括的。
2021-03-29 20:26:29
这现在有些可能,请参阅我的答案。
2021-04-06 20:26:29
在所有变量都具有唯一值的情况下,这可以证明是可能的。请参阅我的代码答案。
2021-04-07 20:26:29
什么是疯狂的方式?
2021-04-09 20:26:29

由于 ES6,这现在以某种方式成为可能:

function getVariableName(unknownVariableInAHash){
  return Object.keys(unknownVariableInAHash)[0]
}

const foo = 42
const bar = 'baz'
console.log(getVariableName({foo})) //returns string "foo"
console.log(getVariableName({bar})) //returns string "bar"

唯一的(小)问题是您必须将未知变量包装在 之间{},这没什么大不了的。

@CodyG。我完全清楚这一点。
2021-03-19 20:26:29
{foo}只是{foo:42}......所以你只是将它作为一个对象发送。请参阅New notations in ECMAScript 2015developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-24 20:26:29
那么你不应该说“感谢 es6 以某种方式可能”,你的答案基本上是——'你可以通过将值作为对象发送,并将键作为变量名来做到这一点'......这也很容易在es5 带有 Object.keys 的 polyfill,或者简单地传递一个具有变量名称的对象作为另一个属性。
2021-04-03 20:26:29
我真的很喜欢这个想法,但(大)问题是你不能再像对待普通变量一样对待你的未知变量,所以你将不得不重写你的函数来处理对象。例如,如果您的函数中有这一行, unknownVariableInAHash + 1它将不再像“将未知变量包装在”之前那样工作{},所以这似乎是一件大事。
2021-04-09 20:26:29

好吧,所有的全局变量都是全局对象(this 或 window)的属性,不是吗?因此,当我想找出变量的名称时,我创建了以下函数:

var getName = function(variable) {
  for (var prop in window) {
    if (variable === window[prop]) {
      return prop;
    }
  }
}
var helloWorld = "Hello World!";
console.log(getName(helloWorld)); // "helloWorld"

有时不起作用,例如,如果在没有 new 运算符的情况下创建了 2 个字符串并且具有相同的值。

这是否取决于在浏览器中运行?或者我误解了什么window
2021-03-26 20:26:29
如果两个对象具有相同的值,这将不起作用。window.a=1;window.b=1;它将返回第一个匹配值的名称。此外,在全局范围内定义变量是不好的做法。
2021-04-09 20:26:29

由于您想要调试(显示 var 的名称和 var 的值),我也一直在寻找它,只是想分享我的发现。

它不是通过从 var 检索 var 的名称,而是通过相反的方式:从 var 的名称(作为字符串)检索 var 的值。

可以在没有 eval 的情况下使用非常简单的代码来完成它,条件是您将 var 传递到带有引号的函数中,并全局声明变量:

foo = 'bar';

debug('foo'); 

function debug(Variable) { 
 var Value = this[Variable]; // in that occurrence, it is equivalent to
 // this['foo'] which is the syntax to call the global variable foo
 console.log(Variable + " is " + Value);  // print "foo is bar"
}

将一组唯一变量转换为我为其编写此函数的一个 JSON 对象

function makeJSON(){ //Pass the variable names as string parameters [not by reference]
ret={};
for(i=0; i<arguments.length; i++){
    eval("ret."+arguments[i]+"="+arguments[i]);
}
return ret;
}

例子:

a=b=c=3;
console.log(makeJSON('a','b','c'));

也许这就是这个查询的原因

ret[x] = x; 绝对没有理由来eval这里!
2021-03-26 20:26:29