John Resig编号为40的JavaScript“参数”

时间:2011-03-24 06:59:12

标签: javascript

这是来自John Resigs Learning Advanced JavaScript http://ejohn.org/apps/learn/#40的示例#40。它被称为使用Variable Number of Arguments To Our Advantage.

如果你能帮忙(谢谢你),我有几个问题

1)在这个函数的第4行root[key] = arguments[i][key];是“root”和“arguments”完全相同,因为“arguments”是一个保留字,包含传递给函数和“root”的所有参数是给参数的名字?

2)root[key] = arguments[i][key]; What exactly is the code doing in this line? Since "root" and "arguments" are already the same (as I guess above), isn这条线是多余的? IsN只是说var合并的属性是相同的,即“name”=“name”和“city”=“city”?

3)在第二个断言中,他说“城市已被复制”。对于第一个断言,他是否还说过“这个名字被复制了”?即。同样的事情发生在“名称”作为“城市”的功能,对吗?换句话说,他可以在两个断言中说“原始名称完整”,“原始城市是完整的” - 即他们都经历了相同的过程?

4)看看这个例子的标题,“使用可变数量的参数对我们有利”,这个例子如何表明我们可以使用可变数量的参数来获得优势?是否只是所有参数都存储在“参数”中,然后可以作为数组遍历?

function merge(root){ 
  for ( var i = 0; i < arguments.length; i++ ) 
    for ( var key in arguments[i] ) 
      root[key] = arguments[i][key]; 
  return root; 
} 

var merged = merge({name: "John"}, {city: "Boston"}); 
assert( merged.name == "John", "The original name is intact." ); 
assert( merged.city == "Boston", "And the city has been copied over." );

2 个答案:

答案 0 :(得分:4)

  

1)在这个函数的第4行root [key] = arguments [i] [key];是“根”和“参数”完全相同

没有。 rootarguments[0]相同,而非arguments

  

2)root [key] = arguments [i] [key];代码在这一行中究竟做了什么?由于“root”和“arguments”已经相同(如上所述),这条线是不是多余了?

仅当i0时。如果从1

开始,该功能会稍微提高效率
  

3)在第二个断言中,他说“城市已被复制”。对于第一个断言,他是否也曾说过“这个名字被复制了”?

不是真的,因为它被分配给自己,所以仍然只有一个实例。

  

4)看看这个例子的标题,“使用可变数量的参数对我们有利”,这个例子如何表明我们可以使用可变数量的参数来获得优势?是否只是所有参数都存储在“参数”中,然后可以作为数组遍历?

它可能更好地标题为“使用JavaScript的能力来处理函数的变量和任意数量的参数对我们有利”,但这将是相当漫长的。

答案 1 :(得分:2)

他正在利用这样一个事实:在Javascript中你可以传递比在函数定义中声明的更多的参数。这些额外的参数可以通过传递给所有函数的arguments数组访问。

在这种情况下,root是命名的第一个参数,但可能有更多未命名的参数。

他在这里传递两个论点:

var merged = merge({name: "John"}, {city: "Boston"}); 

所以root是对象{name: "John"},但arguments是包含两个对象的数组

#4的回答基本上是