Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.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 - Fatal编程技术网

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

Javascript 确定传递给函数后变量的原始名称,javascript,Javascript,我觉得这可能不可能,但我想确定一个变量的原始变量名,该变量已在javascript中传递给函数。我不知道如何更好地解释它,所以看看这个例子是否有意义 function getVariableName(unknownVariable){ return unknownVariable.originalName; } getVariableName(foo); //returns string "foo"; getVariableName(bar); //returns string "bar"

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

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

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

这是针对我正在使用的jquery插件,我希望能够显示传递给“debug”函数的变量的名称。

没错,这在任何情况下都是不可能的,因为只有值被传递到函数中。

全局w/string方法 下面是一种可以用来保留变量名称和值的技术

//设置一个名为g的全局变量
var g={};
//所有其他变量都应定义为此全局对象的属性
g、 foo=‘你好’;
g、 bar=‘世界’;
//设置功能
函数doStuff(str){
if(str in g){
var name=str;
var值=g[str];
//在这里使用变量名和变量值
//对于本例,只需打印到控制台即可
console.log(名称、值);
}否则{
错误('ohsnap!该变量不存在!');
}
}
//调用函数
doStuff('foo');//日志:福你好
doStuff('bar');//日志:酒吧世界

doStuff('fakeVariable');//错误:哦,快照!该变量不存在所有的全局变量都是全局对象(这个或窗口)的属性,不是吗? 因此,当我想找出变量的名称时,我使用了以下函数:

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

有时不起作用,例如,如果创建的两个字符串没有新运算符,并且具有相同的值。

将一组唯一变量转换为一个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;
}

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

多亏了ES6:

函数getVariableName(UnknownVariableInHash){
返回Object.keys(未知变量inahash)[0]
}
常数foo=42
常数条='baz'
log(getVariableName({foo}))//返回字符串“foo”
log(getVariableName({bar}))//返回字符串“bar”
,以进行调试(显示变量名称和变量值), 我也一直在寻找它,只是想分享我的发现

它不是通过从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"
}
我想你可以用

getVariableName({foo});
将二维引用数组与.filter()一起使用 注意:我现在觉得上面@Offermo的答案是最好的。留下我的答案供参考,尽管我基本上不建议使用它。

这是我独立提出的,它需要显式声明变量名,并且只适用于唯一的值。(但如果这两个条件都满足的话,这将起作用。)



我不确定这样做的目的是什么,因为您需要对变量值而不是变量名感兴趣。程序运行时没有变量名。没有“最新”的,也没有“原创”的。哈哈,我想这是一部长片,但值得一试。没有太多的用途,但是如果你想要上下文,你可以看到插件的当前版本:如果你查看对象示例,我更希望标题上写着“clothingCompany Properties”,而不是简单的“object Properties”,这不是很重要,但会很好。有些相关的功能请求:。如果出现这种情况,您可以执行
nameof(foo)//返回字符串“foo”
。只要加上花括号,谢谢你的回答。这是一个很好的解决方案,尽管它并没有解决我遇到的问题。我正在编写一个调试插件,该插件将创建一个模态警报,其中包含关于变量的信息,包括其名称。它需要与任何javascript一起运行,因此将所有变量存储为对象属性不是一个可行的解决方案。谢谢@AndyGroff用
g
变量替换
窗口
变量可能会解决您的问题。但最终你必须通过字符串而不是标识符来访问变量。什么是疯狂的方法?获取回溯,获取函数调用的文件和行号,加载该文件的源代码,找到并解析该行,尝试找出哪个变量是你的参数。由于一行上可能有任意数量的函数调用,并且函数在运行时可能会出现别名,更不用说任务的复杂性了,我希望这一点的疯狂是不言而喻的。现在这在某种程度上是可能的,请参见我的答案。在所有变量都具有唯一值的情况下,这是可以证明的。代码见我的答案。@Perry你当然可以构造非常特殊的情况,在这种情况下,你可以将一个值反转为一个变量名,但这远远不能概括。
ret[x]=x
;绝对没有理由在这里进行
eval
!这是否取决于在浏览器中运行?或者我误解了什么是
window
?如果两个对象具有相同的值,这将不起作用<代码>窗口。a=1;窗口b=1它将返回第一个匹配值的名称。此外,在全局范围内定义变量是不好的做法。
{foo}
只是
{foo:42}
。。。所以你只是把它作为一个对象发送。请参见ECMAScript 2015中的新符号:@CodyG。我很清楚这一点。那么,你不应该说“由于es6的缘故,某种程度上可能会这样”,你的答案基本上是--“你可以通过将值作为对象发送,并将键作为变量名来实现这一点”。。。在es5中,使用Object.keys的polyfill,或者简单地将一个具有变量名的对象作为另一个属性传递,这也是很容易做到的
getVariableName({foo});
// Initialize some variables
let var1 = "stick"
let var2 = "goo"
let var3 = "hello"
let var4 = "asdf"


// Create a 2D array of variable names
const varNames = [
    [var1, "var1"],
    [var2, "var2"],
    [var3, "var3"]
]


// Return either name of variable or `undefined` if no match
const getName = v => varNames.filter(name => name[0] === v).length
  ? varNames.filter(name => name[0] === v)[0][1]
  : undefined


// Use `getName` with OP's original function
function getVariableName(unknownVariable){
  return getName(unknownVariable)
}