【问题标题】:How does javascript es6 iterator lazy evaluation work in memory?javascript es6 迭代器惰性求值如何在内存中工作?
【发布时间】:2020-08-08 00:26:21
【问题描述】:

javascipt es6迭代器惰性求值内存操作流程

当涉及到 JavaScript ES6 迭代器对象和 next() 调用时,据说是以延迟求值形式运行的。

如果将迭代器对象作为生成器函数返回,则该函数不会立即执行。必须执行返回的迭代器对象的 next() 函数才能执行它。 这时候如果执行代码求值公式在调用栈上向上,遇到yield,会不会从调用栈中消失?

function* loop(num) {

    while(true) {
    yield num + 1;
  }

}

loopIterator = loop(1); // return iterator obj
console.log(loopIterator.next()); // call
console.log(loopIterator.next()); // call

【问题讨论】:

  • 如果您能发布一个示例,这将非常有帮助。
  • 迭代器惰性内存操作”似乎与您的问题无关?请在帖子标题中提出问题,而不是标签汤。

标签: javascript ecmascript-6 iterator generator


【解决方案1】:

不清楚您所说的“在调用堆栈上上升”是什么意思。

next() 的调用将生成器函数中的代码放在调用堆栈上并跳转到它停止的地方。这将正常执行,正常使用调用堆栈评估生成器函数内部的函数调用。在某些时候,执行遇到了yield 关键字,该关键字必然在生成器函数代码的堆栈帧中。然后它存储状态,从调用堆栈中删除生成器函数代码,并从next() 调用返回。

【讨论】:

  • 调用栈是执行上下文
  • 是的,它是一个执行上下文堆栈,但是不,它在遇到yield 之前不会“上调用堆栈”。它已经在通过.next() 调用进入的那个执行上下文中。
  • @Bergi 这是命令吗? 1.执行生成器函数 2.生成器对象返回(迭代器) 3.运行iterator.next() 4.生成器函数执行上下文创建(入栈) 5.遇到yield时退出 6.删除生成器函数执行上下文(出栈)
  • 我还是不知道迭代器是如何惰性求值和对内存有益的
  • @zero86 是的,就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2019-09-16
  • 2016-04-18
  • 1970-01-01
  • 2017-03-17
  • 2012-09-20
  • 1970-01-01
相关资源
最近更新 更多