To nie działa zgodnie z przeznaczeniem we wszystkich przypadkach ... Problemem jest to, że oczekuje się .toString
powrócić ciąg, więc metody ciągów w przewidzianym realizacji, nie zadziała, e. sol. sum(2)(3).split()
spowoduje błąd.
Chociaż możemy założyć, że sum()
wynik zawsze będzie liczbą, może nie być prawdą w niektórych przypadkach i może być trudny do debugowania, np. sol. Zauważyłem problem podczas testowania kodu początkowo napisanego pod numerem .toString
tylko na jsbin.com (ma on wartość split
na wewnętrznym argumencie console.log, przesłaniając go).
Zamiast tego .toString
powinien wyglądać jak return String(result);
. Dobrze, że .toString
(gdy nie ma .valueOf
lub nowoczesnej Symbol.toPrimitive
) zajmie się konwersją prymitywów, więc kod oczekujący liczby również będzie działał. Możliwym problemem może być tutaj "podwójna" konwersja.
Lepszym rozwiązaniem może być użycie pary .toString
i .valueOf
lub pojedynczego Symbol.toPrimitive
, jeśli kierujesz reklamy tylko na nowoczesne przeglądarki.
Przykład wykorzystania Symbol.toPrimitive
:
function sum(a) {
let result = a;
function f(b) {
result += b;
return f;
}
f[Symbol.toPrimitive] = hint => hint === 'string' ? String(result) : result;
return f;
}
Przykład wykorzystania .toString
i .valueOf
parę.
function sum(a) {
var result = a;
function f(b) {
result += b;
return f;
}
// avoiding double conversion which will happen in case of .toString
f.valueOf = function() { return result; };
f.toString = function() { return String(result); };
return f;
}
Zasadniczo w pierwszej sumie alertów (1) (2), która jest a & b, a w drugim alarmie jest to suma (6) (- 1) (2) teraz, jak funkcja rozumie, że (2) jest również f (b) argument. – PCA
@Babu pozbyć się myślenia aib. Można by pomyśleć o tym, że 'sum()' jest wywoływane raz, inicjując 'var sum', a następnie przejmując po pierwszym wywołaniu, przetwarzając każde kolejne wywołanie przez wywołanie' f (b) '(ponieważ samo f za każdym razem zwraca się, umożliwiając wykonywanie dalszych łańcuchów), chyba że wystąpi kontekst łańcuchowy. Czy teraz jest jaśniejsze? – Christoph
świetne wyjaśnienie. Czy możesz mi powiedzieć zamiast f.toString możesz pokazać mi kod do zwrotu sumy bezpośrednio. suma funkcji (a) { suma var = a funkcja F (b) { suma suma b + = powrotu } // f.toString = funkcja() {powrotu suma} zwrotny f } suma (1) (2); – PCA