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()