【问题标题】:It this javascript function possible?这个javascript函数可能吗?
【发布时间】:2014-07-23 07:20:25
【问题描述】:

调试时我经常写console.log("foo:"+foo+", bar:"+bar) 之类的东西,是否可以编写一个函数logValues(foo,bar) 来提供相同的输出?本质上,我在问是否有办法从一个变量转到该变量的名称。我是否必须只使用产生[0]: 'value of foo, [1]: 'value of bar' 的索引来设置参数数组的循环?

感谢阅读

【问题讨论】:

  • 您想在控制台中输出还是直接在您的页面中输出?
  • 一个变量可以有多个名字。
  • @MatthewSchinckel 两个变量可以保持相同的值,但一个变量不能有两个名称。
  • @ŠimeVidas,除非你传递一个数组["foo","bar"]
  • @Derek 你是什么意思?当您将数组传递给函数时,该数组将是相应命名参数的值。

标签: javascript


【解决方案1】:

试试这个代码:

var logValues = function(){
    var args = arguments;
    for(var i in args)
        window.console.log(args[i] + ": " + eval(args[i]));
}
logValues("foo","bar");

【讨论】:

  • 我正要放这样的东西,但不记得语法了。该死。除了找到参数的名称之外,什么都有。
  • 我正要回答它,但当我开始时你的回答出现了。
  • @MarkLinus 您的回答不是解决 OP 问题的方法,因为他想像这样调用函数:logValues( foo, bar );。我的观点是,OP 确实 not 有字符串名称,但只有变量名称。
  • @MarkLinus 变量和参数存储在词法环境的环境记录中。这样的环境记录不能被程序访问。 (因此,不可能对其执行for-in 循环。)
  • -1 来自我的反对投票。它一般不会起作用,它只会在特定情况下起作用。因此,不必要地使用eval。参数是按值传递的,而不是按名称传递的,你不能从值到名称反向工作,因为 ECMAScript 中没有这样做的机制,并且多个变量可以保存相同的值。
【解决方案2】:

(这些选项都不能直接回答问题;但应该为您尝试做的事情提供更好的选择)

WebKit 的检查器(我假设是 Firebug)允许您记录复杂类型,根本不需要编写帮助程序!

只需console.log(foo, bar) 即可。或者console.log({foo: foo, bar: bar}),如果你想要输出中的变量名。

替代答案:

您可能会考虑一个只获取一个对象并将其吐出的助手 - 它不会节省太多(如果有的话)打字;但会产生更易读的代码,与记录的输出非常接近。

window.logValues = function(values) {
  var k, v;
  var pairs = [];

  for (k in values) {
    v = values[k];
    pairs.push("" + k + ": " + v);
  }

  console.log(pairs.join(", "));
};

然后你可以这样称呼它:

logValues({foo: 1, bar: "asdf"})

你看到的:

foo: 1, bar: asdf

选项 #3:

或者一个更简洁的例子,可能会去掉比你喜欢的更多的类型信息:

window.logValues = function(values) {
  console.log(JSON.stringify(values));
}

【讨论】:

  • 这个答案表明可以检索对象属性的名称(作为字符串),这与变量和参数不同,无法将它们的名称作为字符串检索。
【解决方案3】:
function logValue(foo)
{
    console.log(foo + ": " + eval(foo));
}

var foo = "something";
logValue("foo");

这可行,但您必须确保您的 foo 变量在 logValue 函数中可用。

【讨论】:

  • 你不能在这个上做logValues("foo","bar")
  • 我知道这一点,但它以一种简单的方式展示了如何根据用字符串表示的名称来评估和记录变量的值。我希望并期望他能够使用 for 循环来修改它。
  • @RasmusTaulborgHummelmose 正如我在上面的评论中已经说过的那样,这种类型的答案不能解决 OP 的问题,因为 OP 想要像这样调用函数:logValue( foo );。 OP 希望将变量传递给该函数,而不是表示该变量名称的字符串。
  • 那么是否有可能获得变量名称的字符串表示形式?这是我能得到的最接近他想要的东西。毕竟这只是一种方便的方法。
  • @RasmusTaulborgHummelmose 我认为这是不可能的。 (可能存在一种非标准的方法。)
【解决方案4】:

我使用两个数组来存储所有数据:

data=[];
names=[];
foo=1;
data[1]="foovalue"; 
names[1]="foo";

bar=2;
data[bar]=28;
names[bar]="bar";

等等,我在项目中使用的所有全局值 接下来你可以编写类似的代码

data[foo]=data[foo] + data[bar];
data[bar]=data[bar]+22;

function log(a,b){
//something like
var=text;
text=names[a] + " = " + data[a];
text=text + linebreak + names[b] + " = " + data[b];
}

你也可以用它来写html;

function writedataval(arrnumber){
  document.getElementById(names[arrnumber] ).innerHTML =  data[arrnumber] ;
}

writedataval(foo);

必须有一个带有 id="foo" 的标签才能成功运行此代码

我认为这种方法在很多方面都非常有益,因为您还可以使用数组索引来访问数据和名称。

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 2011-01-11
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多