2016-06-11 6 views
1

Dies sollte das Objekt selbst beziehen, aber im folgenden Code, warum es anders verhält?Warum bezieht sich das auf die äußere Variable?

var x = 4, 
    obj = { 
     x: 3, 
     bar: function() { 
      var x = 2; 
      setTimeout(function() { 
       var x = 1; 
       alert(this.x); 
      }, 1000); 
     } 
    }; 
obj.bar(); 

Warum ist die Warnung 4 statt 3?

+1

Weil 'this' auf das globale Objekt verweist – philipp

+0

Related: [Wie der richtigen' in einem Rückruf this'/Kontext zugreifen? ] (http://stackoverflow.com/q/20279484/218196). MDN hat auch einen Abschnitt über 'this' in der [' setTimeout'-Dokumentation] (https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout#The_this_problem). –

Antwort

7

Innen setTimeout Rückruf this bezieht sich auf Fensterobjekt, es ist also variabel in globalem Kontext definiert abruft.

Sie können es arbeiten, indem Sie diesen Kontext unter Verwendung Function#bind Methode binden.

var x = 4, 
 
    obj = { 
 
    x: 3, 
 
    bar: function() { 
 
     var x = 2; 
 
     setTimeout(function() { 
 
     var x = 1; 
 
     alert(this.x); 
 
     }.bind(this), 1000); 
 
    } 
 
    }; 
 
obj.bar();


oder eine lokale Variable verwenden, um die Bezugnahme auf this zwischenzuspeichern und verwenden, die innerhalb Callback-Funktion.

var x = 4, 
 
    obj = { 
 
    x: 3, 
 
    bar: function() { 
 
     var x = 2, 
 
     that = this; 
 
     setTimeout(function() { 
 
     var x = 1; 
 
     alert(that.x); 
 
     }, 1000); 
 
    } 
 
    }; 
 
obj.bar();


Siehe dazu auch die MDN-Dokumentation: The "this" problem

+0

Ich sehe die Zeile: var that = this; über die gesamte Codebasis, in der ich arbeite. Ihre Antwort lässt mich fragen, was sind die Tradeoffs zwischen Bindung und dem? –

+0

@JamesCollier: Überprüfen Sie die Dokumentation: ___ ['Die bind() -Methode erstellt eine neue Funktion, deren this-Schlüsselwort beim Aufruf auf den angegebenen Wert gesetzt wird, wobei eine gegebene Argumentfolge vor dem Aufruf der neuen Funktion steht . '] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind) ___ –

+0

Ich verstehe, aber in Bezug auf die Leistung unterscheidet sich die Verwendung von .bind von der Zwischenspeicherung in eine Variable? –

Verwandte Themen