2016-12-23 2 views
0

Ich versuche, mit reagieren zu beginnen. Nachdem ich die Codebeispiele untersucht hatte, stieß ich auf eine ziemlich merkwürdige Sache. Dies ist der Link . Dies ist der Code aus dem Abschnitt Lebenszyklen.-js- Reagieren "Komponente hat mounten" Beispiel

componentDidMount() { 
this.timerID = setInterval(
() => this.tick(), 
    1000 
); 
} 

Also, bei der Einstellung des Intervalls, warum eine Pfeilfunktion verwendet wird? Ich habe es anders versucht (this.tick() selbst), aber es hat nicht wie erwartet funktioniert.

+2

[Arrow-Funktionen binden nicht 'this'.] (Https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions #No_binding_of_this) –

+0

Vielen Dank! –

Antwort

1

setInterval braucht eine Funktion als Referenz übergeben werden, so könnte man

setInterval(() => this.tick(), 1000 ); 

schreibt Diesen this.tick nicht ausgeführt, es sagt einfach setInterval Zecke zu laufen, wenn es um wählt. Die Pfeilfunktion bindet 'dieses' als Ihre Komponente.

jedoch nicht setInterval( function() { this.tick(); }, 1000 ); NICHT binden diese Ihre Komponente sein, so würden Sie setInterval(this.tick.bind(this), 1000 );

schreiben müssen, wenn Sie schreiben setInterval( this.tick(), 1000 ); dann tick ausgeführt wird, bevor es an setInterval übergeben wird, und der Rückgabewert von Zecke ist, was wird von setInterval verwendet.

Ich hoffe, das macht es klar. setInterval will nur einen Verweis auf die Funktion :)

+0

Kein Unterschied zwischen -this.tick() - und -this.tick-. Ich denke es liegt daran, was Dan Prince gesagt hat. Dies wird als globales Objekt betrachtet, so dass es nicht auf "diese" Dinge zugreifen kann: d Danke, Leute! –

+0

oh ja, this.tick wird nicht funktionieren, wenn in setInterVal aufgerufen wird, denn wenn setInterval this.tick aufruft, verwendet es den Kontext innerhalb von setInterval. Also wird dies nicht deine Komponente sein, aber es wird der Kontext sein, in dem sich setInterval befindet. –