Symbol.Iterator - 传递参数

时间:2017-11-08 23:02:28

标签: javascript node.js ecmascript-6

我遇到了JavaScript代码问题。

如何将这段代码参数化?我的意思是将变量10更改为变量,我可以将其作为参数传递。

function createGenerator() {
var _state = 0;
return {
    next() {
        if (_state < 10) {
            return { value: _state++ };
        } else {
            return { done: true };
        }
    }
  }
}
var iterable = {
   [Symbol.iterator] : createGenerator
};
for (var f of iterable) {
   console.log(f)
}

2 个答案:

答案 0 :(得分:2)

您可以将其作为参数传递,然后bind您的createGenerator函数。

&#13;
&#13;
function createGenerator(num) {
var _state = 0;
return {
    next() {
        if (_state < num) {
            return { value: _state++ };
        } else {
            return { done: true };
        }
    }
  }
}
var iterable = {
   [Symbol.iterator] : createGenerator.bind(this,10)
};
for (var f of iterable) {
   console.log(f)
}
&#13;
&#13;
&#13;

答案 1 :(得分:2)

使用partial application - 外部函数接收一个数字并返回现在可以访问闭包中数字的实际迭代器:

function createGenerator(n) {
  return function() {
    var _state = 0;
    return {
      next() {
        if (_state < n) {
            return { value: _state++ };
        } else {
            return { done: true };
        }
      }
    }
  }
}


var iterable = {
  [Symbol.iterator]: createGenerator(5)
};
for (var f of iterable) {
  console.log(f)
}