Еще один вопрос про задачу. Прошу объяснить.
Задача: 
Напишите функцию debounce(f, ms), которая возвращает обёртку, которая передаёт вызов f не чаще, чем раз в ms миллисекунд.
«Лишние» вызовы игнорируются. Все аргументы и контекст — передаются.
Решение:function debounce(f, ms) {
	var state = null;
	var COOLDOWN = 1;
	return function() {
		if (state) return;
		f.apply(this, arguments);
		state = COOLDOWN;
		setTimeout(function() { state = null }, ms);
	}
}
/* Тест должен выводить 14 */
function test() {
	var log = '';
	function f(a) { log += a; }
	f = debounce(f, 1000);
	f(1);
	f(2);
	setTimeout(function() { f(3) }, 100); 
	setTimeout(function() { f(4) }, 1100); 
	setTimeout(function() { f(5) }, 1500);
	setTimeout(function() { alert(log) }, 2000); // 14
}
test();
Не могу понять это решение. Распишите пожалуйста что да как.
PS Особенно непонятно про возвращаемую внутреннюю функцию и про "log"