2013-11-28 49 views
2
var http = require('http'); 
function createRequest() { 
    var options = {}; 
    var request = http.request(options, function(response) {}); 
    request.end(); 
} 
createRequest(); 

上面是一個小的Node.js片段。 http.request的返回值是http.ClientRequest的一個實例,存儲在函數createRequest內的本地變量request中。什麼時候垃圾收集器釋放'請求'對象?

該片段是一個更大的應用程序的一部分,它可以對createRequest進行多次調用。我很困惑,在Node.js中收集的http.request調用垃圾回收這些實例的時機。

回答

2

在這種特殊情況下request將永遠不會被垃圾收集,因爲你還沒有從response讀取任何數據,並響應具有response.req參考request

然而,在這種情況下:

var http = require('http'); 
function createRequest() { 
    var options = {}; 
    var request = http.request(options, function(response) { 
     response.resume() 
    }); 
    request.end(); 
} 
createRequest(); 

request將垃圾收集響應後,最終發出end事件。

+0

「response has'response.req' reference to'request'」,你能指點我的鏈接嗎? –

+2

我不認爲這是記錄,這裏是代碼:https://github.com/joyent/node/blob/v0.10.22/lib/http.js#L1684。無論如何,垃圾收集器不關心它是否被記錄) – vkurchatkin

+0

我認爲對象的請求和響應圖將被垃圾回收器從主程序檢測爲不可訪問,因此有資格進行垃圾回收。 –