javascript - 这是否适合我的循环?

标签 javascript loops for-loop scope let

我写了一个简单的javascript代码。我的 for 循环迭代一个“let”声明的变量,i 介于 0 和 2 之间。仅当 i == 2 时,才会在循环中声明函数。该函数必须返回 i 变量的值。当我从循环外部调用此函数时,该函数返回 i = 2 的值(这对于 block 作用域变量 i 来说是很自然的。但是,当我将循环代码重写为其非循环等效代码块时,该函数(仍然从 block 外部调用)返回 i = 3 的值。发生了什么?

"use strict";
var printNumTwo;

for (let i = 0; i < 3; i++) {
  if (i === 2) {
    printNumTwo = function() {
      return i;
    };
  }
}
console.log(printNumTwo());     //returns 2

//  loop equivalent
{
  let i = 0;
  i = 1;
  i = 2;
  printNumTwo = function() {
    return i;
  }
  i = 3;
}
console.log(printNumTwo());     // returns 3

最佳答案

你的例子很糟糕,因为你的循环在2之后不计数。所以如果你的循环看起来像 i <= 3 :

for (let i = 0; i <= 3; i++) {
  if (i === 2) {
    printNumTwo = function() {
      return i;
    };
  }
}

您将得到与非循环示例完全相同的结果,这是因为 javascript 中的闭包,但 return中断 for 循环。您的函数正在从外部范围保存对该变量的引用。

关于javascript - 这是否适合我的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53958178/

相关文章:

javascript - google-visualization-errors : container is null. 消息:一名或多名参与者未能绘制()

javascript - 如何在 wordpress 上根据用户应用不同的样式表

loops - Python 循环 : idiomatically comparing successive items in a list

java - 从 For 循环 Java 返回字符串值

java - 为什么 for 循环索引不能正常工作?

java - 如何从循环中的onclick内的arraylist获取ID

Javascript如何重命名对象键保持值和位置

javascript - JSDOM - 硬核方式 - 添加外部脚本并使用它

c - 为什么在这两个测试用例中我的输出是错误的?

performance - 加速 matlab 中的一些 for 循环