sum(0)(...)(n)
всегда возвращает функцию
f
Метод
alert
принимает на вход строку, поэтому в момент вызова
alert
выполняется автоматическое преобразование функции
f
к строке. По умолчанию метод f.
toString функции вернул бы текст ее исходного кода, но для функции f метод был преопределен и теперь он возвращает значение currentSum из замыкания.
Казалось бы все хорошо, но это не так. В логических преобразованиях объект (в частном случае -
это функция) всегда true. Поэтому, хоть
console.log( Number(sum(5)(-5)) );
и возвращает 0, результат
console.log( Boolean(sum(5)(-5)) );
будет true.