阅读联系人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);
};
答案 0 :(得分:4)
id
有两个参数,你可以看到here。第一个参数(听起来你已经知道)是函数调用的3,4,5
值。第二个参数是一个类似数组的对象,它包含将传递给函数的所有参数。第二个参数是为什么它在这里使用,以便它可以调用一个函数,该函数具有与传递给第一个函数.apply(thisArg, argsArray)
完全相同的参数。
这是"转发"的常见用法。从一个函数到另一个函数的所有参数,而不必知道参数究竟是什么。由于this
对象是一个类似于数组的数据结构,因此它适合app.listen()
的第二个参数,它需要一个类似于数组的对象作为参数列表。
arguments
不起作用,因为它会调用.apply()
,但会将一个参数传递给一个类似数组的参数列表的函数。这不是server.listen(arguments);
的函数签名。它需要单独传递的每个参数,而不是在列表中传递。 .listen()
用于解决这个问题。它采用类似数组的参数列表,并将它们作为单独的参数传递给被调用的函数。
server.listen()
因为它有四种不同的可能的参数集可以传递给它而变得更加复杂。 .apply()
的使用允许转发代码完全独立于实际传递的参数,因为它只是准确地转发实际传递的内容而不必了解它。