2016-05-03 4 views
0

Ich habe gerade angefangen, mit node.js (und Javascript) herumzuspielen und kann ein grundlegendes Missverständnis haben. Der folgende Code funktioniert wie erwartet. Es stammt aus einem Tutorial für eine einfache API mit Express, mit Ausnahme der extrahierten Funktion, um die Daten zu erhalten (aber das Problem tritt auch bei Restify mit Ausnahme einer weniger informativen Stack-Trace auf).Warum ist `this` in einer übergebenen Methode/Funktion anders als in einem Methodenaufruf an einem übergebenen Objekt

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() {}); 

Da ich nur response zu getandsenddata passieren, um in seine send Methode aufrufen, dachte ich, als auch eine Referenz/Zeiger auf das Verfahren selbst anstelle des gesamten Objekts passieren könnte:

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

Aber das ergibt sich folgende

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) 
... 

die entsprechende Zeile in response.js ist var req = this.req;, das ist das erste Auftreten einer Variablen dieses Namens in dieser Datei. Anscheinend unterscheidet sich der Wert this zwischen den beiden obigen Aufrufen, obwohl die Methode send des Antwortobjekts von derselben Stelle (getdataandsend) aufgerufen wird. Nach this answer und that answer kann das beobachtete Verhalten sinnvoll sein, wenn der erste Aufruf als eine Methode und der zweite als Funktionsaufruf betrachtet wird, aber warum sollte das der Fall sein? send ist immer noch eine Methode von response, oder? Oder sind beide Funktionsaufrufe (... was ist dann response)?

+1

Die höher bewertete Antwort hat viel mehr Informationen als die angenommene Antwort, also lesen Sie beide. –

Antwort

1

In JavaScript, jede Funktion hat ein this Objekt damit verbunden. Dies wird verwendet, um den Daten-/Ausführungskontext der Funktion zu speichern. Bei einer Konstruktorfunktion oder einer Methode speichert das Objekt this den öffentlichen Kontext des Objekts, zu dem diese Methode gehört.

Wenn jedoch eine Funktion kein Konstruktor oder eine Methode ist, dann ist das this Objekt speichert den globalen Kontext, die window im Fall des Browsers ist, und GLOBAL für NodeJS.

Es ist möglich, gesetzt das this Objekt einer Funktion zu jedem Kontext durch die native call, apply oder bind Funktionen.

Link for more information


Was in Ihrem Fall passiert ist, dass, wenn Sie die response.send Funktion zur getdataandsend Funktion senden, die Sie tatsächlich Abstreifen der send Funktion aus dem this Kontext des response Objekts.

Also, wenn die send-Funktion, intern versucht, auf etwas aus dem this Kontext zuzugreifen, erhält es eine undefined, und folglich einen Fehler.

Verwandte Themen