2017-05-03 3 views
3

Ich sehe ein anderes Verhalten nach dem Inlining einer Javascript-Funktion und ich verstehe nicht warum.Unerwarteterweise unterschiedliches Verhalten von Inlining JavaScript-Funktion

Bedenken Sie:

const someFunc = someParam1 => someParam2 => { 
    // doSomething 
} 

const someFuncIndirect = someParam2 => { 
    return someFunc(null)(someParam2) 
} 

// I expected parameter1 and parameter2 to be interchangeable but they are not 
const funcRef1 = someFunc(null) 
const funcRef2 = someFuncIndirect 

Ein Beispiel für das unterschiedliche Verhalten kann hier gesehen werden: https://codesandbox.io/s/0V2VyG7BV

Das erste Eingabefeld verwendet ein Verhalten Marotte nach dem ersten von unfocusing das Eingabefeld der inlined Version und hat Zeichen wurde eingegeben. Das zweite Eingabefeld verwendet die indirekte Methode und leidet nicht unter diesem Problem. Ich habe zusätzlich bemerkt, dass, wenn ich zuerst Text in das zweite Eingabefeld einfüge, das Fokusproblem auf dem ersten Eingabefeld weggeht.

Alle redux-Form scheint mit der Funktion zu tun Referenz ist Aufruf React.createElement mit ihm. Der übergeordnete Aufrufer unterscheidet sich zwischen den beiden, aber ich kann mir nicht vorstellen, wie dies zu diesem Verhalten führen würde. Was vermisse ich?

Update: Fester indirekter func Beispiel, um someParam2 zu verwenden.

Antwort

1

In dem Code, den Sie oben eingefügt haben, wird parameter1 eine Funktion sein, die param2 und doSomething dauert. parameter2 auf der anderen Seite wird eine Funktion sein, die , wenn aufgerufen wird, wird den Rückgabewert von someFunc, die die gleiche wie parameter1 sein wird. Also, wenn Sie wollen, dass beide parameters sich gleich verhalten, ersetzen Sie someFuncIndirect durch someFuncIndirect() in Zeile const parameter2 = someFuncIndirect

+0

Eh, kann nicht mehr mein vorheriger Kommentar kommentieren. Dies ist eine bessere Version davon: Ich habe einen Tippfehler in der Frage behoben, wo someFuncIndirect nicht 'someParam2' verwendet und die Namen der Funktionsreferenzen geändert hat. Wenn ich das tue: 'funcRef1 ('test'); funcRef2 ('test') 'Das Ergebnis sollte gleich sein? 'funcRef1' ist eine Funktion, die' 'etwas" tut, wenn sie mit ''test'' aufgerufen wird. Das gleiche sollte für 'funcRef2' gelten; Wenn sie mit "test" aufgerufen wird, führt sie "someFuncIndirect" aus, was "someFunc" mit "null" und "test" ausführt, die dieselben Argumente sind, die von "funcRef1" übergeben werden –

Verwandte Themen