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

时间:2014-05-31 20:40:24

标签: javascript node.js socket.io requirejs

我是node和JS的新手,并且正在深入研究socket.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的参数,doest更改类型还是别的什么?

谢谢!

3 个答案:

答案 0 :(得分:9)

在JavaScript中,函数是First-class citizen。这意味着它可以被另一个函数返回。

请考虑以下简单示例来理解这一点:

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个对象作为参数立即调用。

答案 1 :(得分:1)

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

让我们说我们分开了这条线:

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

分为两行:

  1.   

    var http = require(' http')

    导入" http"模块库作为一个JSON对象进入http变量。这个模块库有一堆模块,您现在可以通过http var。

  2. 调用它们来访问它们
  3.   

    httpServer = http.Server(app)

    这将使用您在上面调用的快速数据(构造函数的行类型)加载Server模块并将其放入httpServer var。

  4. 上面的区别在于,不是两个步骤,而是将它们压缩成一个,因此http中包含Server模块而不是整个http库。如果您只想使用http库的特定部分,这可能很有用。

答案 2 :(得分:0)

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

例如,here是快递的源代码,用于导出createApplication函数。

here's一篇文章,他们会详细介绍。