2014-02-05 134 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