2014-01-09 28 views
0

文件:MainApp.js問題與的NodeJS,快速變量的作用域,原型

var reqHandler = reqire('HTTPRequestPostHandler').. 
... 
... 
var httpRequestHandler = new reqHandler(); 


app.post('/', httpRequestHandler.handleRootPost); 

文件:HTTPRequestPostHandler.js

HTTPRequestPostHandler =function(){ 
    this.someVar = value; 
} 
HTTPRequestPostHandler.prototype.handleRootPost{ 
    console.log(this.someVar) //Error -> this.someVar is undefined. 

} 

我有這2個文件。 MainApp.js是配置express的地方,各個端點的各種處理程序例如'/'。

但是,當一個POST請求發生,並且請求處理器(HTTPRequestPostHandler.prototype.handleRootPost)被調用時,我得到一個未定義的錯誤,而訪問變量this.someVar

爲什麼會發生這種情況。我在這裏做錯了什麼。

回答

5

這不是一個範圍問題,它是一個this問題。

通常在JavaScript中,this完全由設置,函數的調用方式爲,而不是它定義的位置。所以發生了什麼是你正在傳遞你的方法作爲回調,但因爲它沒有被設置爲你的實例this。 (規範的下一個版本ES6將具有綁定到它們的this的「箭頭函數」,而不是通過它們的調用方式來設置。)

this在函數調用期間獲取的常用方法是當你將函數作爲表達式的一部分調用時,從對象中檢索函數引用,例如

foo.bar(); 

這就要求barthis設置爲foo。但這:

var f = foo.bar; 
f(); 

...不this將是未定義的(在嚴格模式下)或全局對象(在鬆散模式下)。

設置this其他方式是通過Function#callFunction#apply,讓您調用函數,並明確地說this應該是什麼。

您可以bind解決這個問題:

app.post('/', httpRequestHandler.handleRootPost.bind(httpRequestHandler)); 

bind返回,調用它時,會調用原函數與this設置爲你傳遞什麼作爲第一個參數的函數。

更多(我的博客)

+0

哇..那是快。並感謝博客鏈接.. –