Какой тип переменной создается в коде ниже - PullRequest
0 голосов
/ 28 февраля 2020

В приведенном ниже коде есть итератор:

const cart = ['Product 0','Product 1','Product 2','Product 3','Product 4','Product 5','Product 6','Product 7','Product 8','Product 9','Product 10']
function createIterator(cart) {
    let i = 0;//(*)

    return {
        nextProduct: function() {
            //i:0; (**)
            let end = (i >= cart.length);
            let value = !end ? cart[i++] : undefined;

            return {
                end: end,
                value: value
            };
        }
    };
}
const it = createIterator(cart);

Сначала я знаю копию текущего состояния переменных функции и параметры проанализированы. (Верно?) . .. А когда вы запускаете

const it = createIterator(cart);

Создается ли свойство ниже?

//i:0 (**);

Making it.next (); эквивалентно

{
i:0;//state or value of i from createIterator() definition;
next : function(cart){
        let end = (this.i >= cart.length);
                    let value = !end ? cart[this.i++] : undefined;

                    return {
                        end: end,
                        value: value
                    };
        }

Или же состояние значения i в строке (*) из первого кода. Что изменено? Пожалуйста, если этот момент неясен ... дайте мне знать, чтобы объяснить лучше.

1 Ответ

0 голосов
/ 28 февраля 2020

Вызов итератора создаст экземпляр i, ограниченный функцией createIterator. Возвращенный из него объект будет иметь доступ только к этому указанному c экземпляру i, но i не является свойством возвращаемого объекта. Доступ к нему возможен только из-за области действия функции.

Вы можете немного лучше понять, как это работает, если разбить ваш код немного проще:

function createIterator(cart, display) {
    let i = 0;
    return {
        next: function() {
            i++;
            console.log(display + ' next: ', i);
        }
    };
}

const cart1 = [];
const cart2 = [];

const it1 = createIterator(cart1, 'cart1');
it1.next();
it1.next();

const it2 = createIterator(cart2, 'cart2');
it2.next();
it2.next();

Каждый экземпляр итератора имеет различную копию i, и только объект, возвращенный функцией итератора, может получить к нему доступ.

...