JavaScript:获取传递variables的参数值和名称

我想要做的是获取传递给函数的variables的名称和该variables的值,并且只需要将一个variables传递给函数。 所以:

var x = "anything"; function showName() { } showName(x); 

要么

 showName("x"); 

这将返回:“x =任何东西”。

现在,我必须这样做:

 showName("x", x); 

以获取我传入的variables的名称和值。请注意,我对showName的原型中的参数名称不感兴趣,而是调用函数中variables的名称。 此外,该variables可能是本地的,所以我不能使用窗口对象来findvariables。

简短的答案是你不能。

更长,更恶劣的答案是,你可以有一些真正的肮脏。 而且只有从另一个函数调用时才有效。

有两个有趣的属性可以帮助你

arguments.callee调用者

为fn做这样的事情:

 (function(){ var showMe = function(s){ alert(arguments.callee.caller.toString().match(/showMe\((\S)\)/)[1] + ' = '+ s) } x = 1 showMe(x) })() 

什么arguments.callee.caller.toString()。match(..)[1]所做的是寻找在调用它的函数中调用的showMe,并打印它和它的值。

但是这还是相当有限的,因为它只会触及showMe(x)的第一个呼叫。 所以,如果有两个电话,它不会工作。

但是,玩这些神秘的东西很有趣。

 var x = "anything"; function showName(s) { alert(s + " = " + eval(s)); } showName("x"); 

不推荐,但它是。

我已经知道我可以传递一个对象:

 {a:"this is a"} 

其中a是variables的名称,但我真的只想传递一个variables或variables的名称(a或“a”),让函数findvariables的名称和它的值。

我想这样做有点奇怪的原因是我正在编写一个debugging打印例程。 如果我这样称呼它:

 var x = "some string"; say(x); 

要么

 say("x"); 

我想要它打印一些东西:

 X (string) = some string 

我可以很可靠地find一个variables的types,所以我知道如何打印它,但我真的想要避免不必要的这样调用它的冗余:

 say("x", x); 

这是我现在要做的。

OrbMan的答案似乎几乎可以奏效。 当然, eval邪恶的 ,但我认为在这里是可以的,因为它只是一个debugging工具,不会在发布的代码中。 我使用这个解决scheme做了一些自己的testing:

 var x = "this is x"; function say(a) { alert(a + " = " + eval(a)); } say("x"); 

它的工作原理,但只有如果X是全球性的 。 这不起作用:

 function wrapper() { var x = "this is x"; say("x"); } 

所以,这个解决scheme是接近的,但是由于我几乎没有使用全局variables,所以这是行不通的。 该死,它是如此接近。 我想我需要的是“按名称呼叫”而不是“按价值”或“通过参考”。 而且我需要一个函数,无论它是否被另一个函数调用,都可以工作。

由于我自己已经花了很多时间在这个问题上,所以在这里提出这个问题是一种绝望的行为,我必须得出结论,实际上没有办法做到这一点。 哪里哪里。

致各位回复,感谢您的全力帮助。

你可以创build一个哈希值并将其传递给:

 var x = {a: 1,b:2} function showVars(y) { for (var z in y) { alert(z + " is " + y[z]); } } showVars(x); 

这不一定会显示variables的名称,但是它确实允许键值对,这可能更重要的是您所需要的。

这是我用来debugging的。 没有全局variables,没有eval,没有arguments.callee或arguments.caller:

 var Helpers = (function () { // ECMAScript 5 strict mode 'use strict'; var Module = {}; Module.debug = function () { var i; for (i = 0; i < arguments.length; i++) { console.log(arguments[i] + ':', this[arguments[i]]); } }; Module.SomeObject = function SomeObject() { this.someMember = 1; this.anotherMember = 'Whatever'; Module.debug.call(this, 'someMember', 'anotherMember'); var privateMember = { name: 'Rip Steakface', battleCry: 'Raaaaaaaaahhhhhhhhhrrrrrrrrrg!' }; Module.debug.call(privateMember, 'name', 'battleCry'); }; return Module; }()); 

对于那些想知道为什么要这样做的人,这只是一种有效logging多个variables以及名称的方法。

如果你想能够logging嵌套成员,就像在Module.debug.call(obj, 'hair.fluffiness') ,你可以像这样修改函数:

 Module.debug = function () { var i, j, props, tmp; for (i = 0; i < arguments.length; i++) { tmp = this; props = arguments[i].split('.'); for (j = 0; j < props.length; j++) { tmp = tmp[props[j]]; } console.log(arguments[i] + ':', tmp); } }; 

不幸的是,我找不到有效logging多个不是对象成员的私有variables的方法,例如var roll = 3, value = 4; Module.debug.call(???); var roll = 3, value = 4; Module.debug.call(???);

不知道你可以直接从JavaScript获得你想要的东西,因为variables名并不带有它引用的值(把variables名看作只是编译器知道的标识符,但是在运行时抛出)。

然而,你可以做一些稍微不同的事情,允许传递命名参数。 创build一个匿名对象,并将其传递给你的函数:

 function showNames(o) { for( var ix in o ) { alert( ix + ":" + o[ix] ); } } var z = { x : "Anything" } showNames( z ); // or showNames( { a : "ay", b : "bee", c: "see" } ) 

为了迭代对象属性,我倾向于使用function样式,如下所示:

 Array.iteri = function(o, f) { for(var i in o) { f(i, o[i]) } } function showNames(o) { Array.iteri( o, function(i,v) { alert( i + ": " + v ) }); } showNames( { a : "ay", b : "bee", c: "see" } ) 

下面的代码是关于你能做的最好的。 不幸的是,函数中的局部variables是隐藏的调用对象的属性,所以它们不能从JavaScript访问,如窗口[a],其中a是窗口对象的属性。

 x = "this is x"; var say = function(a) { document.write(a + " = " + window[a]); } say("x"); var wrapper = function () { var x = "this is x"; document.write(x + " = " + eval("x")) } wrapper()