为什么迭代器对象变量未定义?
why is iterator objects variable undefined?
学习在 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);
}
学习在 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);
}