【发布时间】:2018-01-30 03:53:42
【问题描述】:
由于我试图掌握 JavaScript 中可迭代的概念,因此我使用以下代码构建了一个:
let range = {
from: 0,
to: 5
};
range[Symbol.iterator] = function() {
return {
current: this.from,
last: this.to,
next() {
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
};
for (let num of range) {
console.log(num);
}
Symbol.iterator 方法返回一个对象,该对象包含一个方法 (next) 和两个属性(current 和 from)。此对象中的属性等于对象range 中的属性。
由于current 等于this.from 和last 等于this.to,我假设我可以直接在方法next 中使用this.from 和this.to,如下所示:
let range = {
from: 0,
to: 5
};
range[Symbol.iterator] = function() {
return {
next() {
if (this.from <= this.to) {
return { done: false, value: this.from++ };
} else {
return { done: true };
}
}
};
};
for (let num of range) {
console.log(num);
}
但是,这样做会阻止迭代开始。观察到这一点,我有两个问题:
为什么可以属性
current和last使用关键字this并让它引用对象range而方法next不能?current、last和next()都是 same 对象的一部分,该对象由Symbol.iterator返回。另外,鉴于
Symbol.iterator()返回一个单独 对象,该对象中的this关键字不应该引用该对象本身吗?换句话说,属性current和lastnot 是否应该能够使用关键字this从range访问属性?range不是一个单独的对象吗?
【问题讨论】:
-
this的一个用法在[Symbol.iterator]方法中,另一个在.next方法中。对象字面量无关紧要,它们没有自己的作用域。
标签: javascript oop iteration symbols