2017-11-25 4 views
0

schrieb ich eine Funktion:über Javascript-Funktion valueOf toString und 'Curry' Funktion anders verhalten in Chrome, Firefox und Knoten Umgebung

function add(){ 
    let arr = []; 
    arr = arr.concat(Array.prototype.slice.apply(arguments)) 
    let fun = function(){ 
     arr = arr.concat(Array.prototype.slice.apply(arguments)) 
     return fun 
    } 
    fun.toString = function(){ 
     console.log(222) 
     return arr.reduce(function(total, num){ 
      return total+num 
     }, 0) 
    } 
    return fun 
} 
console.log(add(1,2)(2,3)(3)) 

Dies ist in Chrome: enter image description here

Zwei Fragen:

  1. In der ersten Zeile, warum ist 'f 11', nicht '11'?

  2. Warum Ausgabe 'f 11' erstens, nicht '222', ich denke, die Typumwandlung sollte zuerst ausgeführt werden, und dann berechnete Ergebnis auf der Konsole ausgeben.

Eine weitere seltsame Sache, ist es das Ergebnis in Firefox mit gleichen Codes: enter image description here

Und das Ergebnis in Knotenumgebung: enter image description here

Ich verstehe nicht, warum es in FF scheint und Knoten hat die berechnete Operation nicht ausgeführt.

Bitte helfen Sie mir ... Vielen Dank!

+0

Die * f * bedeutet * Funktion * die ist richtig –

+0

Was ist der Sinn von diesem? Warum müssen Sie toString aufrufen, um den Wert zu erhalten? Das ist völlig kontraintuitiv. Der Versuch, eine 'add'-Funktion zu haben, die sowohl variadisch als auch gleichzeitig curried ist, ist ... komisch. –

+0

@ JonasW. korrekte Funktion? – DaXiong1

Antwort

1

Zuerst können Sie den gesamten Code ein wenig verschönern:

function add(..arr){ 
    function fun(...args){ 
    arr.push(...args); 
    return fun 
    } 

    fun.toString = function(){ 
    return arr.reduce((total, num) => total + num) 
    }; 
    return fun; 
} 

Und wie Sie richtig bemerkt haben, ist eine Funktion, die Anmeldung für die Umwelt ganz oben. Firefox und Knoten zurückzukehren, den Code der Funktion, während Chrome sth mag:

out("f" + add.toString()) 

so unsere toString Funktion wird aufgerufen, und etwas wird protokolliert. Um ein konsistentes Verhalten zwischen den verschiedenen Umgebungen haben könnten wir toString explizit nennen:

console.log(add(1)(2)(3).toString()); 

Dies kann gefolgert werden:

console.log("" + add(1)(2)); 
+0

Ja, du bist richtig. Das könnte eine gute Lösung sein. Aber ich möchte wissen, warum eine Funktion outputed ist, nicht ein Wert, und in FF oder Knoten, 'console.log (222)' scheint nicht ausgeführt werden ... – DaXiong1

+0

@daXiong 'Firefox und Knoten geben den Code der Funktion, während Chrome tut so etwas wie: ' –

0

Wenn das, was Sie wollen, ist add, die sowohl variadische und Curry ist (was ich noch denken ist komisch), gerade dies zu tun:

const add = (...args) => { 
    let accum = args; 
    let f = (...fargs) => { 
    if (!fargs.length) { 
     return accum.reduce((a, b) => { return a + b; }, 0); 
    } else { 
     accum = accum.concat(fargs); 
     return f; 
    } 
    }; 
    return f; 
}; 

add(1,2,3)(); // 6 
add(1)(2,3)(); // 6 
add()(); // 0 

Jetzt nur noch rufen Sie die zurückgegebene Funktion ohne Argumente den Wert raus. Sie könnten damit spielen, um es performanter zu machen (z. B. indem Sie .push in einer Schleife anstelle von .concat verwenden), aber das sollte funktionieren.

+1

... oder' accomm.push (... Fargs) ' –

+0

Vielen Dank, ich habe es. Das ist eine nette Idee! – DaXiong1

Verwandte Themen