2017-01-15 1 views
2

Ich bin ein Neuling in Javascript. Und ich stand vor der folgenden Frage.Javascript ES5 Array-Funktionen. forEach Sekunde "This Value" Argument

Wie gesagt here, fast alle ES5 Array-Funktionen (forEach, Karte, Filter, alle, einige) können zusätzliche zweite Argument.

Wenn es angegeben wird, wird die Funktion aufgerufen, als ob es eine Methode dieses zweiten Arguments ist. Das heißt, das zweite übergebene Argument wird der Wert des dieses Schlüsselworts innerhalb der Funktion, die Sie übergeben.

array.forEach(function(currentValue, index, arr), thisValue) 
array.map(function(currentValue, index, arr), thisValue) 

Im Gegenteil:

array.reduce(callback, [initialValue]) 
array.reduceRight(callback, [initialValue]) 

Beachten Sie, dass weder verringern() noch reduceRight() akzeptiert ein optionales Argument, an dem der Wert gibt die Verkleinerungsfunktion aufgerufen werden soll . Siehe Function.bind() Methode, wenn Sie Ihre Reduktionsfunktion als Methode eines bestimmten Objekts aufgerufen haben müssen.

Was bedeutet es: "als eine Methode eines bestimmten Objekts aufgerufen werden"? Könnte jemand ein Beispiel angeben, wie sich dies auf meinen Code auswirken könnte?

Vielen Dank im Voraus.

+1

Ein JavaScript wichtiges Merkmal wie *** funktionelle *** Sprache ist, dass Sie Funktion als params passieren kann (aka, 'Callbacks ') zu Wrapping-Funktion (aka,' Funktion höherer Ordnung'), und das 'Kontext' (aka,' this' Schlüsselwort) dieser Rückrufe ist schwer zu überdenken, wie Sie nie wann und wo wissen (obwohl viele Zeit im Besitz des globalen Objekts wie "Fenster" im Browser) werden sie aufgerufen, wenn Sie also verwenden 'this 'in diesen Callbacks ist' Function.bind' eine gute Möglichkeit, den Kontext des Callbacks zu "pinnen", während' arrow function' automatisch an den umgebenden Kontext bindet. – Xlee

Antwort

1

Es ist einfach. In der Callback-Funktion ist der Wert this das zweite an die Array-Methode übergebene Argument. Wenn Sie this nicht verwenden, ist das Argument irrelevant und Sie müssen es nicht übergeben.

"use strict"; 
 
[0].forEach(function(currentValue, index, arr) { 
 
    console.log(this); // 1234 
 
}, 1234);

anzumerken, dass in nachlässigem Modus der this Wert auf ein Objekt überführt wird. Wenn Sie also das Argument weglassen oder undefined verwenden, erhalten Sie stattdessen das globale Objekt.

Wenn Sie etwas ähnliches mit reduce benötigen, dann verwenden bind:

"use strict"; 
 
[0, 1].reduce(function(prevValue, currValue, index, arr) { 
 
    console.log(this); // 1234 
 
}.bind(1234));

+0

und ohne sie wäre "dies" der Kontext, in dem die Methode verwendet wird. Wie "Fenster", wenn direkt in der Browser-Konsole ausgeführt – charlietfl

+0

@Oriol so, warum brauchen wir das Ding? warum mache nicht einfach folgendes: [0,1] .forEach (function (val, ind, ar)) {less necessaryScope = this;}) 'ohne' bind'-Aufrufe? –

+0

@IvanTalalaev Es ist nicht sehr nützlich, wenn Sie einen Funktionsausdruck verwenden.Aber wenn die Funktion woanders definiert ist, müssen Sie vielleicht ein "this" übergeben – Oriol