【问题标题】:What is the order of execution in a JavaScript 'for' loop?JavaScript“for”循环中的执行顺序是什么?
【发布时间】:2018-03-24 18:27:18
【问题描述】:

这篇文章是这篇文章的简化版:

What is the exact order of execution of Javascript's for loop?

我对为什么在使用 for 循环时总是感到困惑非常感兴趣。我想了解如何在后台执行 for 循环。

for (let i = 0; i < 10; i++) {
  alert(i);
};

因此,据我了解,这是我所理解的执行此类操作的顺序:

1) 引擎初始化i = 0

2) 引擎检查i &lt; 10

3) 引擎从包含 for 语句的括号中弹出

4) 引擎为此迭代执行循环内的代码

5) 引擎弹回括号内递增i

6) 从第 2 步开始重复。

我想我对第 3 步感到最困惑。引擎是否真的跳出“for”循环来执行块内的代码?

据我了解,JavaScript 是单线程的,只能同步运行,所以我有点困惑,在 'for' 语句中间,引擎如何保持 'for' 的状态在执行块中的代码时的内存.... 除非'for'循环中的三个条件中的每一个都是它们自己独立的命令,可以在继续执行之前执行和完成块。

我什至不确定我是否正确地问了这个问题,我对编程还是比较陌生,我现在只知道 vanilla JS ......下个月是我进入 node 的时候;)

想通了: Click for an image of my breakpoint placement

我了解到顺序是这样的: 1)var i初始化为0

2) var i 被检查为真

3) 如果为真,则执行代码,

4) 一旦执行完成,i 就会递增

5) 加一,i 被检查为真

6) 重复步骤 3 - 5,直到 i 为假

7) 迭代完成。

谢谢大家。 Chrome 调试器比我想象的要强大得多!

【问题讨论】:

  • 除了从括号中弹出而是进入下一行你的问题到底是什么?
  • 我不知道你所说的“弹出”是什么意思。括号仅与代码的语法结构有关,与实际执行的内容无关。 “'for'循环中的三个条件都是各自独立的命令,可以执行”切中要害。
  • 在这种情况下,i 的范围在花括号块内。顺便说一句,如果您使用旧的var 关键字,那么如果for 循环周围没有函数,那么i 就在周围函数或窗口的范围内
  • 循环头中的三个表达式中的每一个实际上都是同步的“小块”代码。像其他所有东西一样同步执行。在上下文(尤其是内联块)中“弹出”和“弹出”的心理模型对您没有帮助。
  • 您了解while 循环的工作原理吗?这些可能更容易理解。另外,您知道引擎如何“保持”if 语句之类的状态吗?

标签: javascript for-loop iteration javascript-engine


【解决方案1】:

(抱歉,没有足够的代表将其放入 cmets)

我建议使用浏览器调试功能。我不确定您使用的是什么浏览器,但只是谷歌“使用 X 浏览器调试 JS”,那里有很多教程。

首先,创建一个简单的 for 循环 htm 文件。然后打开浏览器并初始化调试器。然后在浏览器中打开文件。打开“来源”部分,您的代码将可见。单击带有 for 循环的行并设置断点,并在变量上创建监视(如 i)。

然后重新加载 htm 文件,调试器将在断点处停止。然后一步一步“步入”for循环。您将能够通过查看每个步骤的代码来观察系统是如何移动的,您可以观察变量的变化,希望这能让您对它的工作方式有所了解。

这是理解您可能拥有的任何复杂代码并轻松调试错误的好方法。

【讨论】:

  • 这个!!这正是我所需要的。我在 for 循环的每一步都有断点。我了解到,首先,counter变量被初始化,基本上变成了一个检查truthy,执行代码,递增,检查truthy,执行代码,递增等的三角形。...谢谢你的建议!
  • @matthewvolk 我很高兴能帮上忙。我发现它非常有用,尤其是在具有多个 IF 子句的嵌套 for 语句中。它有助于在每一步停下来看看发生了什么..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 2018-01-24
  • 1970-01-01
相关资源
最近更新 更多