【问题标题】:Next() method does not continue iteration when called directly from the function in which it was createdNext() 方法在直接从创建它的函数中调用时不会继续迭代
【发布时间】:2022-11-18 02:43:36
【问题描述】:

我用 next() 方法创建了一个函数 squared() 。该函数的起始值为 n = 0。如果 n <= 5,则 next 方法应返回一个值和 false。每次我调用 next 时,它都应继续重复此过程。 我遇到的问题是,当我直接在控制台中调用 squared().next() 时,它只会继续为我提供第一个返回值。这意味着每次我调用它时它仍然从 0 开始计数。

但是当我将函数平方设置为这样的对象时: squaredIterator = squared(); 然后我称它为dis way: squaredIterator.next(); 它完美地工作并继续迭代直到 n > 5。

我不明白的是为什么只有当我从一个对象调用它时它才能正常工作。是不是 dat 对象有一个特殊的内存,他们保存 n 的最后一个值???

function squared() {
      let n = 0;
      
      return {
       next() { 
         n++;
            
      if(n <= 5) {
    return {                                
         value: n * n,
         done: false
     };
    }
    return {
     value: undefined, 
     done: true
    }
  }
  };
}

console.log(squared().next());
console.log(squared().next());
// value: 1, done: false
// value: 1, done: false
let squaredIterator = squared();

console.log(squaredIterator.next());
// value: 1, done: false
console.log(squaredIterator.next();
// value: 1, done: true

【问题讨论】:

    标签: javascript arrays iterator


    【解决方案1】:

    当您调用 square() 时,它会创建一个新的闭包并返回一个包含 next 的新对象,该对象将该闭包作为其上下文。

    每次调用square() 时,它都会创建一个新的闭包和对象。但是当您将它绑定到一个变量let squaredIterator = squared() 时,您现在就有了对返回对象的引用。

    然后你可以从同一个返回的对象调用next(),从你在开始时绑定对象时创建的同一个闭包中。

    考虑这个例子:

    function Dog(name) {
      return {
        speak() { console.log(`Hi I'm ${name}`) }
      }
    }
    
    const rocky = Dog('Rocky')
    const obie = Dog('Obie')
    
    rocky.speak()
    obie.speak()
    
    Dog('Jericho').speak()
    Dog('Silvester').speak()

    每次我们调用Dog(exampleName)时,我们都会创建一个新的闭包,其中变量name = exampleName。所以我们可以保存闭包并与之交互的唯一方法是创建对它的引用,也就是将它绑定到一个变量。

    【讨论】:

      猜你喜欢
      • 2020-04-17
      • 2021-11-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多