javascript - Function.apply 在 connect 的源代码中

标签 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.listenthis已经是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() 的使用允许转发代码完全独立于实际传递的参数,因为它只是转发实际传递的内容而无需了解任何相关内容。

关于javascript - Function.apply 在 connect 的源代码中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29862049/

相关文章:

javascript - Bootstrap 模式无法在 jsfiddle 中打开

node.js - 如何防止 npm 安装后出现 Webpack 错误?

node.js - ExpressJS 请求对象

javascript - 从另一个嵌套 Controller 调用函数

javascript - 排序 "day" "week" "month"和 "year"

ASP.NET:为什么我的 JavaScript 对象设置为 null?

node.js - 如何调试无服务器框架插件?

node.js - 如何动态更改 Node js中的数据库连接?

runtime-error - ConnectEx 返回 false 并且 WSAGetLastError 返回 0

sockets - java : Can socket connect to IPv6 address while binding a IPv4 address?