Function.apply 在 connect 的源代码中

Function.apply in connect's source code

阅读 connect 的 source code,我遇到了以下几行。我想知道为什么它使用 Function.apply.

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

据我了解,Function.apply 用于您想要调用具有不同 this 值的函数的情况。 上面的例子中server.listenthis已经是server了,下面这样写不就可以了吗?

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

.apply(thisArg, argsArray) 接受两个参数,您可以在 here 中看到这些参数。第一个参数(听起来您已经知道)是函数调用的 this 值。第二个参数是一个类似数组的对象,其中包含将传递给函数的所有参数。这第二个参数就是为什么在这里使用它,以便它可以使用传递给第一个函数 app.listen() 的完全相同的参数来调用函数。

这是 "forwarding" 从一个函数到另一个函数的所有参数的常见用法,而无需知道参数实际是什么。由于 arguments 对象是一个类似数组的数据结构,它适合 .apply() 的第二个参数,它需要一个类似数组的对象,它是一个参数列表。


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

server.listen(...) 由于它有四个不同的可能参数集可以传递给它这一事实而变得更加复杂。 .apply() 的使用允许转发代码完全独立于实际传递的参数,因为它只是转发实际传递的内容而无需知道任何相关内容。