Создание счетчика с использованием функции замыкания и самопризывания

Мне интересно, почему этот код не работает,

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
Другие вопросы по тегам