2012-12-15 7 views
5

ich folgenden Code in das heißt versucht haben, firefox und node.jsunterschiedliches Verhalten der Keyword "this" zwischen node.js und Browsern

var x = 10; 
var o = { x: 15 }; 
function f(){ 
    console.log(this.x); 
} 
f(); 
f.call(o); 

die Ergebnisse in Browser sind 10, 15, aber das Ergebnis in node.js ist undefined, 15.

Bitte erklären Sie mir, was ist das unterschiedliche Verhalten von "diesem" Schlüsselwort in Browsern und node.js? Ich habe viele Seiten gelesen, aber es gab keine offensichtliche Antwort. Vielen Dank im Voraus.

+0

Vielleicht Node.js läuft im strikten Modus, standardmäßig ... (Im strikten Modus, 'this, innerhalb einer Funktion, nie auf das globale Objekt. –

+2

Wie laden Sie diesen Code in node.js? Sie würden dieses Verhalten sehen, wenn das, was auch immer den node.js-Code geladen hat, es als einen Funktionskörper wie über 'neue Funktion (javascriptSourceCode)()' analysierte, weil 'var x' dann eine lokale Variable zu einer Funktion deklarierte, anstatt eine oberste Ebene zu sein global. –

+2

@ ŠimeVidas, in diesem Fall würden Sie eine Ausnahme erhalten, die 'null', nicht' undefiniert' für 'this.x' dereferenziert. –

Antwort

6

In Nodejs geladene Javascript-Dateien werden automatisch in anonyme Funktionen eingeschlossen.

So in Knoten, was Sie wirklich läuft:

(function(/* There are args here, but they aren't important for this answer */){ 
    var x = 10; 
    var o = { x: 15 }; 
    function f(){ 
    console.log(this.x); 
    } 
    f(); 
    f.call(o); 
})(); 

Der Browser dies nicht tut. Das Problem ist, dass jetzt in Node x nur eine normale Variable im Bereich der Funktion ist, es ist nicht Teil des globalen Bereichs. Wenn Sie f() auf diese Weise anrufen, ist this innerhalb f der globale Bereich.

Wenn Sie x direkt auf den globalen Bereich setzen, wird es in beiden Fällen funktionieren.

this.x = 10; 

Die x auf dem window globale Objekt im Browser und das global globale Objekt in Knoten platzieren wird.

Im Allgemeinen laden Sie Dinge nicht global in Knoten, stattdessen gruppieren Sie Ihren Code in Module, wie described here. Es gibt Informationen über die verschiedenen globalen Dinge, auf die Sie zugreifen können: here. Und wenn Sie neugierig auf die Verpackung sind, können Sie es sehen here.

+0

Vielen Dank. Könnten Sie mir bitte irgendeine Dokumentation von nodej geben? –

+1

@CongNguyen Ein bisschen am Ende hinzugefügt. – loganfsmyth

2

Beim Aufrufen einer regulären Funktion wie in f() unterscheidet sich das Verhalten im strikten Modus vom regulären Modus. Im regulären Modus ist this das globale Objekt (z. B. window). Im strikten Modus wird thisundefined sein.

Abgesehen von diesem Unterschied ist die Zuweisung von this in einem Funktionsaufruf vollständig in der Javascript-Standard angegeben, wenn Sie also Unterschiede in verschiedenen Situationen sehen, dann ist es wahrscheinlich wegen strict Modus. Fügen Sie beiden Umgebungen den Modus strict hinzu, und Sie sollten ein konsistentes Verhalten sehen.

Sie können den Abschnitt "Sichern von Javascript" in diesem MDN reference für weitere Informationen lesen.

+0

Nein, strikte Modus ist nicht mit OP-Problem verbunden. Wenn "this" "undefined" wäre, würde die Funktion werfen, aber sie protokolliert 'undefined' (also' this' ist das globale Objekt in beiden Szenarien). –

Verwandte Themen