带require的双参数:var io = require('socket.io')(http);

Double parameters with require: var io = require('socket.io')(http);

本文关键字:io require socket http 参数 var      更新时间:2023-09-26

我是node和JS的新手,正在研究套接字。IO聊天示例(http://socket.io/get-started/chat/)。我在服务器上看到了这段代码:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

我看过其他教程,从来没有见过双括号之后的要求。(http)是做什么的?它是require的参数吗,它改变类型了吗,还是别的什么?

谢谢!

在JavaScript中,函数是一等公民。这意味着它可以由另一个函数返回。

考虑下面的简单示例来理解这一点:

var sum = function(a) {
    return function(b) {
        return a + b;
    }
}
sum(3)(2);  //5
//...or...
var func = sum(3);
func(2);   //5

在您的示例中,require('socket.io')返回另一个函数,该函数以http对象作为参数立即调用。

如果您有一个库http并且它有一个导出模块server,则展开

假设我们把这行分开:

var http = require('http').Server(app);

分成两行:

  1. var HTTP = require(' HTTP ')

    导入"http"模块库作为JSON对象放入http变量。这个模块库有一堆模块,你现在可以通过http变量调用它们。

  2. httpServer = http.Server(app)

    这将用上面调用的express数据加载Server模块(Kind line a constructor),并将其放入httpServer变量中。

上面的不同之处在于,他们将这两个步骤压缩成一个步骤,因此http内部有Server模块,而不是整个http库。如果您只想使用http库的特定部分,这可能很有用。

Nodejs允许您使用语句module.exports = something将对象/函数分配给导出的模块。因此,这些语句中的每一条都导入了一个库,然后运行分配给导出库的函数。

例如,这里是express导出createApplication函数的源代码。

这里有一篇更详细的文章