如何解决为什么迭代器对象变量未定义?
学习使对象在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.length
和this[a]
中,this
对象不是arrayLikeObject
,而是具有next()
方法的对象。
您也可以解决此问题,但我认为采用另一种方法并使next
成为箭头函数会更简单。这样this.length
和this[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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。