2016-05-03 4 views
0

node.js(およびjavascript)で再生を開始したばかりであり、基本的な誤解があります。次のコードは期待どおりに動作します。データを取得するために抽出された関数を除いて、エクスプレス付きの単純なAPIのチュートリアルから取得されています(ただし、あまり有益ではないスタックトレースを除いて復元でも発生します)。渡されたオブジェクトのメソッド呼び出しと異なる、渡されたメソッド/関数内の `this`がなぜですか

var getdataandsend = function(request,respfun) { 
     respfun({a:1,b:2}); 
    } 
app.get('/:id', function (request, response) { 
    getdataandsend(request,response.send);}); 

var express = require('express'); 
var app = express(); 

var getdataandsend = function(request,response) { 
     var res = {a:1,b:2}; // actually sql query using request.params 
     response.send(res); 
    } 
app.get('/:id', function (request, response) { 
    getdataandsend(request,response);}); 

var server = app.listen(1234, function() {}); 

しかし、私は、そのsendメソッドを呼び出すためにgetandsenddataresponseを通過するので、私は、同様の方法自体の代わりに、全体のオブジェクトへの参照/ポインタを渡すかもしれないことを考え出し

しかし、これはresponse.jsで該当する行がです以下

TypeError: Cannot read property 'req' of undefined 
    at send (...\test\node_modules\express\lib\response.js:103:17) 
    at getdataandsend (...\test\misctest.js:6:9) 
    at ...\test\misctest.js:9:6 
    at Layer.handle [as handle_request] (...\test\node_modules\express\lib\router\layer.js:95:5) 
... 

になりは、そのファイル内のその名前の変数の最初の出現です。明らかに、応答オブジェクトのメソッドsendが同じ場所(getdataandsend)から呼び出されたとしても、上記の2つの呼び出しでは、thisの値が異なります。 this answerthat answerに続いて、最初の呼び出しがメソッドとみなされ、2番目の呼び出しが関数呼び出しと見なされる場合、観測された振る舞いは意味をなさないかもしれませんが、なぜそうであるのでしょうか? sendは依然としてresponseの方法ですか?または両方の関数呼び出し(... responseは何ですか?)ですか?

+1

より高く評価された回答には、受け入れられた回答よりも多くの情報があるため、両方を必ず読んでください。 –

答えて

1

JavaScriptでは、すべての関数にはthisオブジェクトが関連付けられています。これは、関数のデータ/実行コンテキストを格納するために使用されます。

コンストラクタ関数またはメソッドの場合、thisオブジェクトは、このメソッドが属するオブジェクトのパブリックコンテキストを格納します。関数は、コンストラクタまたはメソッドでない場合

しかし、その後thisオブジェクトはブラウザの場合window、そしてNodeJSためGLOBALグローバルコンテキストを格納します。

それはすることが可能となるネイティブcallapply又はbind関数を使用して、任意のコンテキストに機能thisオブジェクトを設定します。

Link for more information


何あなたのケースに起こることは、あなたがgetdataandsend関数にresponse.send機能を送っているとき、あなたが実際にresponseオブジェクトのthisコンテキストからsend機能をリッピングしていることです。

したがって、send関数が内部的にthisコンテキストから何かにアクセスしようとすると、undefinedとなり、結果としてエラーになります。

関連する問題