从题目的要求可以知道,这个函数每次调用都会返回一个质数,也就是说每次调用后都会返回一个函数。
首先我们定义一个判断一个数是否为质数的方法:
function isPrime(num) { for (let i = 2; i <= Math.sqrt(num); i++) { if (num % i === 0) { return false } } return true }
传统的方式是使用闭包方法来解决:
function primeHandler() { let prime = 1 return () => { while (true) { prime++ if (isPrime(prime)) { return prime } } } } const getPrime = primeHandler() console.log(getPrime()); // 2 console.log(getPrime()); // 3 console.log(getPrime()); // 5
既然是单步执行的,那么我们就可以使用迭代器方式实现:
var prime = {} prime[Symbol.iterator] = function() { let prime = 1; return { next() { while(true) { prime++ if (isPrime(prime)) { return prime; } } } } } var getPrime = prime[Symbol.iterator]().next; console.log(getPrime()); // 2 console.log(getPrime()); // 3
上一个实例我们知道实现迭代器的方式是很麻烦的,可以使用生成器函数去替代迭代器的功能,所以上面的代码可以使用生成器函数改造如下:
function* primeGenerator () { let prime = 1 while (true) { prime++ if (isPrime(prime)) { yield prime } } } var getPrime = primeGenerator().next().value console.log(getPrime()); // 2 console.log(getPrime()); // 3