作者: 文章来源:
本文原地址:https://www.mimiwuqi.com/webqianduan/195910.html
从题目的要求可以知道,这个函数每次调用都会返回一个质数,也就是说每次调用后都会返回一个函数。
首先我们定义一个判断一个数是否为质数的方法:
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
更多 建站教程 请访问 https://www.mimiwuqi.com/webqianduan/