Javascript 使用ES6生成迭代器

Javascript 使用ES6生成迭代器,javascript,javascript-objects,Javascript,Javascript Objects,这个问题有很多活动的部分,但我将从我的第一个误解开始 上下文:Iterator被定义为一个实现next()方法的对象,下面的两个示例都有这个方法。不同之处在于,我使用不同的next()方法创建对象。在我的第一个示例中,我正在创建一个函数,该函数返回一个包含next()方法的对象。然后我给这个函数分配了一个变量,所以如果我没有弄错的话,我实际上是在用一个预定义的函数动态生成一个对象 var letters = ["a","b","c"]; function createIterator(arra

这个问题有很多活动的部分,但我将从我的第一个误解开始

上下文:
Iterator
被定义为一个实现
next()
方法的对象,下面的两个示例都有这个方法。不同之处在于,我使用不同的
next()
方法创建对象。在我的第一个示例中,我正在创建一个函数,该函数返回一个包含
next()
方法的对象。然后我给这个函数分配了一个变量,所以如果我没有弄错的话,我实际上是在用一个预定义的函数动态生成一个对象

var letters = ["a","b","c"];

function createIterator(array) {
    var i = 0;

    return {                //return an Object with a next() method
        next: function(){
            i < array.length ?    //if statement
            {value: array[i++], done: false}:
            {value: undefined, done: true};
         }
    }
}

var myIterator = createIterator(letters);
console.log(myIterator.next()) //{value: a, done: false}
console.log(myIterator.next()) //{value: b, done: false}
console.log(myIterator.next()) //{value: c, done: false}
console.log(myIterator.next()) //{value: undefined, done: true}

我认为这是因为我误解了如何用不同的方法创建对象来调用
next()
方法。它可能是有范围的,但我真的不能完全确定。

在第一个示例中,
I
被捕获在一个闭包中,因此它可以工作。在第二个示例中,每次调用函数时,
i
都会被创建为新的。您可以将对象的属性设置为:

var-literal={
字母:[“a”、“b”、“c”],
i:0,
next:function(){//与前面相同的下一个函数
返回这个。我console.log(literal.next())
第一个代码段中的
var i=0l
是怎么回事?这是实际的代码吗?您的问题似乎是您将
var i
声明从外部范围移动到了
next
函数中,现在每次调用时它都被初始化为
0
。而不是像你期望的那样递增。
var literal = {
    letters: ["a", "b", "c"],
    next: function(){        //same next function as before
        var i = 0;
        i < this.letters.length ? 
        {value: this.letters[i++], done: false}:
        {value: undefined, done: true};
         }
}

console.log(literal.next()) //{value: a, done: false}
console.log(literal.next()) //{value: a, done: false}
console.log(literal.next()) //{value: a, done: false}
console.log(literal.next()) //{value: a, done: false}