2014-02-05 98 views
1

我检查在net.js的createServer()功能:节点net.js服务器()

exports.createServer = function() { 
return new Server(arguments[0], arguments[1]); 
}; 

我检查服务器()函数的源代码在net.js,发现

function Server(/* [ options, ] listener */) { 
    if (!(this instanceof Server)) return new Server(arguments[0], arguments[1]); 
    events.EventEmitter.call(this); 

    var self = this; 
    // ...... 
} 

当我们调用createServer()函数时,该函数将调用new Server()。并且在Server()函数中,由于this不是服务器的实例,因此它将再次调用new Server()。基于我的理解,新的Server()函数会一直调用新的Server(),因此会陷入无限循环。有人能解释我在这里的错吗?

如果Quentin是正确的,那么if声明永远不会是真的,因为在createServer()函数中调用了new Server()

回答

0

这是JavaScript中非常常见的模式。看看下面:

function MyInst(a, b) { 
    this.a = a; 
    this.b = b; 
} 

var inst = MyInst(a, b); 

,你将有有效附加属性abglobal对象。因此,你有一个条件,以检查是否调用适当的构造函数调用:

function MyInst(a, b) { 
    if (!(this instanceof MyInst)) 
    return new MyInst(a, b); 
    this.a = a; 
    this.b = b; 
} 

// Now I can be lazy and not use "new" 
var inst0 = MyInst(a, b); 
// Or I can still use it properly 
var inst1 = new MyInst(a, b); 

同样的事情在net.Server()正在做。基本上保护人们不受他们自己的影响,并且始终确保对象上下文是自身的一个实例。

1

return new Server声明之前有一个if声明。

它看起来像是在那里从调用Server函数的人那里恢复而不用作为构造函数(即与new)。

+0

是的,我注意到有一个if语句。但是当我们没有服务器的实例时,我们将陷入无限循环。对? – Benson

+0

错误。在'return'和'Server'之间有一个'new'(所以它会下降一级,然后if语句不再成立) – Quentin

+0

我刚刚在net.js中发现'createServer()': 'exports.createServer = function(){ return new Server(arguments [0],arguments [1]); };'根据你的说明,'if'语句永远不会是真的,因为每当你创建一个服务器时,你会调用'new Server()',当它进入'Server()'函数时,'if'语句总是真正。 – Benson