阅读连接的 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);
};
.apply(thisArg, argsArray)
接受两个参数,您可以看到描述 here .第一个参数(听起来您已经知道)是函数调用的 this
值。第二个参数是一个类似数组的对象,其中包含将传递给函数的所有参数。这第二个参数就是为什么在这里使用它,以便它可以使用传递给第一个函数 app.listen()
的完全相同的参数调用函数。
这是将所有参数从一个函数“转发”到另一个函数而不必知道参数实际是什么的常见用法。由于 arguments
对象是一个类似数组的数据结构,它适合 .apply()
的第二个参数,它需要一个类似数组的对象,它是参数。
server.listen(arguments);
将不起作用,因为它会调用 .listen()
,但会将单个参数传递给作为数组的函数-like 参数列表。那不是 server.listen()
的函数签名。它需要单独传递每个参数,而不是在列表中传递。 .apply()
用于解决这个问题。它采用类似数组的参数列表,并将它们作为单独的参数传递给被调用函数。
server.listen(...)
更加复杂,因为它有四个不同的可能参数集可以传递给它。 .apply()
的使用允许转发代码完全独立于实际传递的参数,因为它只是转发实际传递的内容而无需了解任何相关内容。