Когда вы передаете объект в console.log()
, он вызывает .toString()
, чтобы распечатать значение.
Таким образом,
sum(4)
возвращает функцию. Последующий вызов этой функции
sum(4)(5)
также возвращает функцию. Затем, передаваемая в console.log()
, и результат в консоли
9
Следует отметить, что console
API является довольно шатким квази-стандарт, и потому, что он разработан в целях отладки помощи существуют некоторые виды поведения, которые могут быть запутанным. В этом случае, однако, кажется, просто назовите .toString()
без каких-либо других «полезных» смешных дел. Если, однако, вы просто передать простой пустой объект console.log()
, как этот
console.log({})
вы получите (по крайней мере, с Firebug в Firefox) полезный интерфейс для навигации объекта. Это здорово, если вы что-то отлаживаете, но если вы пытаетесь понять, как работает язык, это поведение может ввести в заблуждение.
В заключительной ноте, трюк в публикуемом коде может быть расширен таким образом, что функция может разгласить числовой результат тоже, добавив .valueOf()
метод:
function sum (a) {
var sum = a;
function f (b) {
sum += b;
return f;
}
f.toString = function() {
return sum;
};
f.valueOf = function() {
return sum;
};
return f;
}
Если вы сделаете это, то вы получите Правильный ответ от
console.log(2 * sum(4)(5))
Здесь: 'console.log (сумма (4) (5));'. 'console.log' вызывает метод' toString' для функций, по крайней мере, в Chrome. –
Отступы помогут. –
В вашем примере код f.toString() - это функция, которая никогда не выполняется. – bhspencer