Function.apply在connect的源代码中

时间:2015-04-25 06:53:25

标签: javascript node.js connect

阅读联系人source code,我遇到了以下几行。我想知道为什么要使用Function.apply

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

据我了解,Function.apply用于您想要调用具有不同this值的函数的情况。 由于上述示例中的server.listen this已经server,因此仅仅编写以下内容是否足够?

app.listen = function(){
  var server = http.createServer(this);
  return server.listen(arguments);
};

1 个答案:

答案 0 :(得分:4)

id有两个参数,你可以看到here。第一个参数(听起来你已经知道)是函数调用的3,4,5值。第二个参数是一个类似数组的对象,它包含将传递给函数的所有参数。第二个参数是为什么它在这里使用,以便它可以调用一个函数,该函数具有与传递给第一个函数.apply(thisArg, argsArray)完全相同的参数。

这是"转发"的常见用法。从一个函数到另一个函数的所有参数,而不必知道参数究竟是什么。由于this对象是一个类似于数组的数据结构,因此它适合app.listen()的第二个参数,它需要一个类似于数组的对象作为参数列表。

arguments不起作用,因为它会调用.apply(),但会将一个参数传递给一个类似数组的参数列表的函数。这不是server.listen(arguments);的函数签名。它需要单独传递的每个参数,而不是在列表中传递。 .listen()用于解决这个问题。它采用类似数组的参数列表,并将它们作为单独的参数传递给被调用的函数。

server.listen()因为它有四种不同的可能的参数集可以传递给它而变得更加复杂。 .apply()的使用允许转发代码完全独立于实际传递的参数,因为它只是准确地转发实际传递的内容而不必了解它。