Создание счетчика с использованием функции замыкания и самопризывания
Мне интересно, почему этот код не работает,
var uniqueInteger = function() {
var counter = 0;
return function() { return counter++; }
};
console.log(uniqueInteger()()); // 0
console.log(uniqueInteger()()); // 0
console.log(uniqueInteger()()); // 0
console.log(uniqueInteger()()); // 0
и этот код делает. Единственное отличие состоит в том, что функция вызывается самостоятельно вместо вызова ее в console.log().
var uniqueInteger = (function() {
var counter = 0;
return function() { return counter++; }
}());
console.log(uniqueInteger()); // 0
console.log(uniqueInteger()); // 1
console.log(uniqueInteger()); // 2
console.log(uniqueInteger()); // 3
Я очень новичок в JS, так что прошу прощения за мою нелюбовь. Спасибо!
1 ответ
Решение
Второй код создал замыкание с var counter = 0
только один раз, так как при определении uniqueInteger он вызывал функцию, которая возвращала функцию, где выполняется инициализация. Первый код создает var counter = 0
каждый раз, когда вы звоните
Обратите внимание, что с первым кодом вы можете сделать:
ui = uniqueInteger();
console.log(ui()); // 0
console.log(ui()); // 1
ui2 = uniqueInteger();
console.log(ui()); // 2
console.log(ui2()); // 0
console.log(ui()); // 3
console.log(ui2()); // 1