为什么迭代器对象变量未定义?

问题描述

学习使对象在Javascript中可迭代。

对象是:

var arrayLikeObject = {
    0: "hello",1: "there",2: "crappy coder",length: 3,}

然后我这样做使其可迭代:

arrayLikeObject[Symbol.iterator] = function(){
    return {
        current: 0,// <---- but... it IS defined.
        next() {
            // let current = 0; // putting it here makes it work
            if(current < this.length) {
                let a = current;
                current++;
                return {done: false,value: this[a]};
            }
            else {
                return {done: true};
            }
        }
    };
};

然后,当我使用它运行时:

console.log("after making it iterable: ==============");
for(let str of arrayLikeObject) {
    console.log(str);
}

我得到“电流未定义”,但据我所知,确实如此。我只是不明白。我认为函数可以看到超出其范围的变量,但不能以其他方式看到它们,除非如果这是正确的术语,否则它们会“被遮盖”。我忘了。

解决方法

current不是变量,而是属性,因此您需要将其引用为this.current

但是,您还遇到this的问题:

this.lengththis[a]中,this对象不是arrayLikeObject,而是具有next()方法的对象。

您也可以解决此问题,但我认为采用另一种方法并使next成为箭头函数会更简单。这样this.lengththis[a]将按预期工作。将current设为闭包内的普通变量:

var arrayLikeObject = {
    0: "hello",1: "there",2: "crappy coder",length: 3,}

arrayLikeObject[Symbol.iterator] = function(){
    let current = 0;
    return {
        next: () => {
            if(current < this.length) {
                return {done: false,value: this[current++]};
            }
            else {
                return {done: true};
            }
        }
    };
};

console.log("after making it iterable: ==============");
for(let str of arrayLikeObject) {
    console.log(str);
}