将arguments对象分配给变量

时间:2015-05-05 21:04:18

标签: javascript node.js

所以,我对Javascript很陌生,并且想知道使用NodeJS的arguments对象(可能是对语言不熟悉的人)。

考虑一下这个简单实现printf样式格式

的代码片段
function format(formatString) {
  var i = 1;
  return formatString.replace(regex, function(match) {
    switch(match) {
      case "%s": return arguments[i++];
    }
  });
}

调用函数format("Hi my name is %s. Im %s years old", "Jon", "30")会产生以下输出My name is 11. Im My name is %s. Im %s years old years old

关于arguments的研究表明我们在这里没有处理“真正的”数组,并且使用Array.slice(arguments)实际上产生了一个。但是,我正在努力遵循以下事实:

执行这个简单的作业var args = arguments而不是引用args而不是arguments让我的代码完美运行(我偶然发现了检查util.format的NodeJS来源

我的问题是现在,V8在这里练习什么样的黑魔法?是否在后台执行了任何转换?如果,转换是什么样的? Node告诉我两个变量都是object类型。

先谢谢你帮助我。

1 个答案:

答案 0 :(得分:2)

这不起作用。 arguments仅表示函数内部的任何内容。在您的情况下,arguments引用匿名函数的参数。您需要捕获父作用域中的参数。类似的东西:

function format(formatString) {
  var i = 1, args = Array.prototype.slice.call(arguments);
  return formatString.replace(/%[a-z]/gi, function(match) {
    switch(match) {
      case "%s": return args[i++];
    }
  });
}
format("Hi my name is %s. Im %s years old", "Jon", "30");

// Output: "Hi my name is Jon. Im 30 years old"