【问题标题】:why is iterator objects variable undefined?为什么迭代器对象变量未定义?
【发布时间】:2021-02-03 06:13:26
【问题描述】:

学习在 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变量对象属性在JS中是不同的。
  • 明白了。有点忘记了在创建对象文字时需要在对象方法中使用它,以便在其方法中使用对象属性:-o。有没有其他地方可以解决这样的问题,有人在精神上受阻时需要帮助(在谷歌搜索、检查教程和 stackoverflow 答案之后,仍然无法“解开”)。比如,第二双眼睛?猜测这类问题很快就会被否决 x)
  • 其实。刚刚注意到(因为一堆其他打印输出妨碍了它。它仍然不起作用,我不再使用 if(this.current &lt; this.length) 得到任何错误,但我也没有从 for...of 循环中得到任何结果。

标签: javascript iterable


【解决方案1】:

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);
}

【讨论】:

  • 谢谢。通过显式创建一个对象,然后在返回它之前填充它(对象称为迭代器)来重写它。避免使用箭头函数,因此必须跟踪“this”并明确共享它。不想再介绍另一个我不习惯的东西,箭头功能。不过,您的解释完全有帮助:)。我接受你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
相关资源
最近更新 更多