function sum(a) {
var currentSum = a;
function f(b) {
currentSum += b;
return f;
}
f.toString = function() {
return currentSum;
};
return f;
}
alert( sum(1)(2) ); // 3
alert( sum(5)(-1)(2) ); // 6
alert( sum(6)(-1)(-2)(-3) ); // 0
alert( sum(0)(1)(2)(3)(4)(5) ); // 15
sum()
она возвращает нам функциюf
которая в свою очередь может быть вызвана или выводить результат если больше не будет использоваться с помощью искуственно добавленого метода f.toString()
Если же функция f
будет вызвана то когда выполнение дойдет к currentSum += b;
она не найдет в своем лексическом окружении currentSum
и через[[Scope]]
поищет выше то есть в функции sum,
там найдет это значение и использует его. После этого вернет саму себя для того чтобы пользователь имел возможность использовать в очередной раз функцию f