首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

嵌套的for循环- javascript:请解释为什么在我声明内部for循环之后第一个索引会迭代

在嵌套的for循环中,内部for循环的第一个索引会迭代是因为在每次外部for循环迭代时,内部for循环都会完整地执行一次。当外部for循环的索引变化时,内部for循环会重新开始执行,包括内部for循环的索引也会重新初始化。

具体来说,当外部for循环的索引变化时,内部for循环会被执行多次,每次执行都会从内部for循环的第一个索引开始迭代。这是因为内部for循环的索引是在内部for循环的作用域中声明的局部变量,每次内部for循环执行完毕后,该变量的作用域就会结束,下一次内部for循环执行时会重新声明和初始化该变量。

因此,在嵌套的for循环中,内部for循环的第一个索引会在每次外部for循环迭代时重新初始化并迭代。这样可以确保内部for循环在每次外部for循环迭代时都从头开始执行,以完成所需的嵌套循环逻辑。

以下是一个示例代码,用于说明嵌套的for循环中内部for循环第一个索引的迭代过程:

代码语言:txt
复制
for (var i = 0; i < 3; i++) {
  console.log("外部for循环索引:" + i);
  for (var j = 0; j < 2; j++) {
    console.log("内部for循环索引:" + j);
  }
}

输出结果为:

代码语言:txt
复制
外部for循环索引:0
内部for循环索引:0
内部for循环索引:1
外部for循环索引:1
内部for循环索引:0
内部for循环索引:1
外部for循环索引:2
内部for循环索引:0
内部for循环索引:1

从输出结果可以看出,每次外部for循环迭代时,内部for循环的索引都会重新初始化为0,并按照内部for循环的条件进行迭代。这就是为什么在声明内部for循环之后,第一个索引会迭代的原因。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

python流程控制

所谓的流程控制是计算机运算领域的用语意指在程序运行时个别的指令(或是陈述 子程序)运行或求值的顺序不论是在声明式编程语言还是函数式编程语言都有类似的概念 关于声明式编程语言和函数式编程语言详解 以上是官方的解释...while是一个条件循环语句,与if声明相比,如果 if 后的条件为真,就会执行一次相应的代码块。而while中的代码块会一直循环执行,直到循环条件不再为真。 while:适合于循环次数是未知的。...while循环是条件 性的,而 for 循环是迭代的,所以continue在开始下一次循环前要满足一些先决条件,否则循环会正常结束。...程序中当遇到 continue 语句时, 程序会终止当前循环,并忽略剩余的语句,然后回到循环的顶端。在开始下一次迭代前,如果是条件循环,我们将验证条件表达式。...: for循环用于已经知道循环的次数或者循环遍历可迭代的数据类型例如:列表 字典等 while循环用于不知道具体的循环次数的情况或者无限循环 发布者:全栈程序员栈长,转载请注明出处:https://

1.9K40
  • 还担心面试官问闭包?

    此篇文章总结与《JavaScript忍者秘籍》 《你不知道的JavaScript上卷》 前言 为什么我们需要理解并且掌握闭包,且不说大道理,就问你要不要成为JavaScript高手?不要?...简单理解词法作用域的概念,其实也就是我们常说的作用域,关于JavaScript中欺骗词法以及更多关于词法作用域的介绍,请翻阅《你不知道的JavaScript》。...总之,从上面的代码中,我们可以看到闭包的有趣的三个概念 内部函数的参数包含在闭包中 作用域之外的所有变量、即便是函数声明之后的那些声明,也都包含在闭包中....如果我们试图假设循环中的每一个迭代在运行时都会给自己捕获一个i的副本,但是根据作用域的工作原理,尽管循环中五个函数是在各个迭代中分别定义,但是他们都被封闭在共享的作用域中,因此还是只有一个i。...所以回到正题,我们需要使用闭包,在每一个循环中每一个迭代都让他产生一个闭包作用域。 所以我们代码修改如下: ? but!!!你也发现了,这样并不姓,不是IIFE会产生一个闭包的么?

    41220

    还担心面试官问闭包?

    此篇文章总结与《JavaScript忍者秘籍》 《你不知道的JavaScript上卷》 前言 为什么我们需要理解并且掌握闭包,且不说大道理,就问你要不要成为JavaScript高手?不要?...简单理解词法作用域的概念,其实也就是我们常说的作用域,关于JavaScript中欺骗词法以及更多关于词法作用域的介绍,请翻阅《你不知道的JavaScript》。...总之,从上面的代码中,我们可以看到闭包的有趣的三个概念 内部函数的参数包含在闭包中 作用域之外的所有变量、即便是函数声明之后的那些声明,也都包含在闭包中....如果我们试图假设循环中的每一个迭代在运行时都会给自己捕获一个i的副本,但是根据作用域的工作原理,尽管循环中五个函数是在各个迭代中分别定义,但是他们都被封闭在共享的作用域中,因此还是只有一个i。...所以回到正题,我们需要使用闭包,在每一个循环中每一个迭代都让他产生一个闭包作用域。 所以我们代码修改如下: ? but!!!你也发现了,这样并不行,不是IIFE会产生一个闭包的么?

    46810

    JavaScript 权威指南-学习笔记(一)

    JavaScript 权威指南-学习笔记 JavaScript是一门高级、动态、解释型变成语言,非常适合面向对象和函数式编程风格。 JavaScript的变量是无类型的。...hello.html:file:///F:/javascript/%E7%BB%83%E4%B9%A0DEMO/hello.html [请添加图片描述] F12打开开发者工具窗口,就可以在控制台看到输出信息...声明-关键词 const:声明常量(不可被修改,重新赋值会抛出TypeError) let:声明变量(在同一作用域中重新声明相同变量会导致语法错误)推荐使用此方法声明变量 var:声明变量(使用var声明的变量作用域为包含函数...[]; //创建一个空数组 a0 = "zero"; //添加一个元素 a.push("one"); //在末尾添加一个值 flat()和flatMap()打平数组 flat()打平一级嵌套...数组迭代 1.数组循环 var officers = [s { id: 20, name: 'Captain' }, { id: 24, name: 'General' },

    75000

    JavaScript 权威指南第七版(GPT 重译)(三)

    JavaScript 对象就是关联数组,本节解释了为什么这很重要。 在 C、C++、Java 等强类型语言中,一个对象只能拥有固定数量的属性,并且这些属性的名称必须事先定义。...数组中插入或删除点之后的元素的索引会根据需要增加或减少,以使它们与数组的其余部分保持连续。splice()的第一个参数指定插入和/或删除开始的数组位置。第二个参数指定应从数组中删除的元素数量。...在 ES6 之前,只允许在 JavaScript 文件的顶层或另一个函数内部定义函数声明。虽然一些实现弯曲了规则,但在循环、条件语句或其他块的主体内定义函数实际上是不合法的。...然而,在 ES6 的严格模式下,允许在块内部声明函数。在块内定义的函数仅存在于该块内部,并且在块外部不可见。...在function之前的开括号是必需的,因为没有它,JavaScript 解释器会尝试将function关键字解析为函数声明语句。有了括号,解释器正确地将其识别为函数定义表达式。

    23910

    【翻译】ES6生成器简介

    在常规的JS程序中,无限循环会造成严重的混乱甚至错误,但是如果与生成器函数配合,无限循环会非常顺畅地运行,甚至有时候我们正需要它!...但是在JavaScript中,上面的代码声明了一个特殊类型的函数-生成器函数。...下面我们讨论一下生成器函数的内部结构。生成器函数在很多方面与常规函数相似,内部结构语法是他们的区别之一。 首先解释一下之前我们提到的yield关键字。...我不建议在生成器函数中使用return关键字来返回结果,因为在使用for...of循环迭代生成器时,生成器内部使用return的值将会被过滤。下面举例说明。...上面的问题我(原作者)会相继在博客中解答,so,粉我吧(顺便粉我也行)。

    79370

    用简单的方法学习ECMAScript 6

    因此我写下了这篇对ES6及其新特性的简要介绍,所有知识点都解释得通俗易懂,简明扼要,对于像我这样的新人非常友好。 ?...但是,我这里只是想解释迭代协议是什么,使它的概念更清晰,并且引入关于它的ES6新特性。? 通过迭代协议接收数据的语言构造: // 解构实际上是在做迭代的工作(重复性的工作)来从数组中提取数据。...这个独一无二字符制造器使对象可迭代,并且使我们可以使用for-of循环。酷~现在我们已经在我们的代码里创建了一个定制的迭代对象(或类),这使我们可以在项目中是的迭代部分的代码更简单。...对我来说没有必要把所有逻辑都放进for-of循环来做一个迭代的工作,我只需要创建一个有意义的可迭代类,然后把我的逻辑都放在其中,然后我就可以在不同的地方用for-of循环使用我的类,并且可以很简单地实现迭代工作...注意: 为什么Map和Set都是具备'size'属性而不是像数组那样用'length'属性呢?这个不同之处的原因在于length是对序列而言的,序列这种数据结构是有索引的,像数组这样。

    1.8K41

    作用域和闭包

    # try / catch 少有人会注意到 JavaScript 的 ES3 规范中规定 try /catch 的 catch 分句会创建一个块作用域,其中声明的变量仅在 catch 内部有效。...引擎会在解释 JavaScript 代码之前首先对其进行编译。...var a = 2;, JavaScript 会将其看成两个声明:var a; 和 a = 2;。第一个声明是在编译阶段进行的,第二个声明会被留在原地等待执行阶段。...IIFE 会为每个迭代都生成一个新的作用域,使得延迟函数的回调可以将新的作用域封闭在每个迭代内部,每个迭代中都会含有一个具有正确值的变量供我们访问。...这个行为指出变量在循环过程中不止被声明一次,每次迭代 都会声明。随后的每个迭代都会使用上一个迭代结束时的值来初始化这个变量。

    72020

    JavaScript 面试要点:作用域和闭包

    在多层的嵌套作用域中可以定义同名的标识符,这叫作 “遮蔽效应”(内部的标识符“遮蔽”了外部的标识符)。...# try / catch 少有人会注意到 JavaScript 的 ES3 规范中规定 try /catch 的 catch 分句会创建一个块作用域,其中声明的变量仅在 catch 内部有效。...var a = 2;, JavaScript 会将其看成两个声明:var a; 和 a = 2;。第一个声明是在编译阶段进行的,第二个声明会被留在原地等待执行阶段。...IIFE 会为每个迭代都生成一个新的作用域,使得延迟函数的回调可以将新的作用域封闭在每个迭代内部,每个迭代中都会含有一个具有正确值的变量供我们访问。...这个行为指出变量在循环过程中不止被声明一次,每次迭代 都会声明。随后的每个迭代都会使用上一个迭代结束时的值来初始化这个变量。

    45020

    《你不知道的js(上卷)》笔记1(基础知识和闭包)

    1.基础知识 1.1 编译原理 尽管通常将 JavaScript 归类为“动态”或“解释执行”语言,但事实上它是一门编译语言。...,确保使用上一个循环迭代结束时的值重新进行赋值。...拜bar()所声明的位置所赐,它拥有涵盖foo()内部作用域的闭包,使得该作用域能够一 直存活,以供bar()在之后任何时间进行引用。 bar()依然持有对该作用域的引用,而这个引用就叫作闭包。...,尽管循环中的五个函数是在各个迭代中分别定义的, 但是它们都被封闭在一个共享的全局作用域中,因此实际上只有一个i。...在迭代内使用IIFE会为每个迭代都生成一个新的作用域,使得延迟函数的回调可以将新的作用域封闭在每个迭代内部,每个迭代中都会含有一个具有正确值的变量供我们访问。

    44620

    大话 JavaScript(Speaking JavaScript):第十六章到第二十章

    就嵌套而言,“foo()”是外部范围,“bar()”是内部范围。 遮蔽 如果作用域声明了与外部作用域中的变量同名的变量,则内部作用域中将阻止对外部变量的访问,并且所有嵌套在其中的作用域。...如果您的函数相对较小(无论如何都应该是这样),那么您可以放松这个规则,将变量声明在使用它们的地方附近(例如,在for循环内部)。这样更好地封装了代码片段。...的函数声明之后。...陷阱:方法内部的函数会遮蔽 this 您经常在 JavaScript 中嵌套函数定义,因为函数可以是参数(例如回调),并且因为它们可以通过函数表达式在原地创建。...通常情况下,您不需要知道这里解释的细节。 数组索引并非看起来那样。 到目前为止,我一直假装数组索引是数字。这也是 JavaScript 引擎在内部实现数组的方式。

    40420

    ES6知识点补充

    next方法返回又会返回一个对象,有value和done两个属性,value即每次迭代之后返回的值,而done表示是否还需要再次循环,可以看到当value为undefined时,done为true表示循环终止...... of第一个条件中声明的变量即可,res的done属性控制是否继续遍历下去 for... of循环同时支持break,continue,return(在函数中调用的话)并且可以和对象解构赋值一起使用...,在回调函数中再嵌套回调函数会导致代码非常难以维护,这是人们常说的“回调地狱” ?...z+1找到相应的值后再赋给变量z,但是因为暂时性死区的原因(let/const"劫持"了这个块级作用域,无法在声明之前使用这个变量,上文有解释),导致在let声明之前就使用了变量z,所以会报错 这样理解函数的默认值会相对容易一些...的拦截方法,当对这个代理对象的某个属性进行赋值的时候会执行对象内部的[[SET]]函数进行赋值,这个操作会间接触发defineProperty这个方法,随后会执行定义的callback函数 这样就实现了无论对象嵌套多少层

    1.1K50

    JS的控制流程

    ,直接执行下一个迭代循环。...与 break 语句的区别在于, continue 并不会终止循环的迭代,而是: 在 while 循环中,控制流跳转回条件判断; 在 for 循环中,控制流跳转到更新语句。...continue 语句可以包含一个可选的标号以控制程序跳转到指定循环的下一次迭代,而非当前循环。此时要求 continue 语句在对应的循环内部。...可选的 break 语句确保程序立即从相关的 case 子句中跳出 switch 并接着执行 switch 之后的语句。若 break 被省略,程序会继续执行 switch 语句中的下一条语句。...finally子句在try块和catch块之后执行但是在下一个try声明之前执行。无论是否有异常抛出或捕获它总是执行。 你可以嵌套一个或者更多的try语句。

    7.3K10

    Python函数基础

    在这个解释过程中,会记录好变量以及该变量的所属作用域(是全局范围内的变量还是函数的本地变量),但一定注意,def声明函数的过程中不会进行变量的赋值(参数默认值除外,见下文),只有在函数调用的时候才会进行变量赋值...一般来说,在函数嵌套时,内层函数会作为外层函数的返回值(当然,并非必须)。既然内层函数要作为返回值,这个嵌套的内层函数更可能会是lambda匿名函数。...y+z 嵌套在循环内部的函数 看下面嵌套在循环内部的函数,在每个迭代过程中都声明一个匿名函数,这个匿名函数返回循环控制变量i,同时将声明的匿名函数保存到列表L中。...,会发现它们的值完全相同,且都是循环迭代的最后一个元素值i=4。...为什么循环迭代过程中的i没有影响到匿名函数的返回值?这是一个非常值得思考的问题,如果不理解结果,请仔细回顾前文函数变量的细节。如果还是不理解,请阅读Python作用域详述。

    48420

    深入理解JavaScript作用域

    我们在 for 循环的头部直接定义了变量 i,通常是因为只想在 for 循环内部的上下文中使用 i,但是实际上 此时的 i 被绑定在外部作用域(函数或全局)中。...为 ${i}`); // ReferenceError: i is not defined 此时 for 循环头部的 let 不仅将 i 绑定到了 for 循环的迭代中,事实上将它重新绑定到了循环的每一个迭代中...,确保使用上一次循环迭代结束的值重新进行赋值。...中的变量,而无需到外面的 foo(..)中查找。作用域会在查找都第一个匹配的标识符时就停止。 在多层的嵌套作用域中可以定义同名的标识符,这叫”遮蔽效应“。...JavaScript的执行分为:解释和执行两个阶段 解释阶段 词法分析 语法分析 作用域规则确定 执行阶段 创建执行上下文 执行函数代码 垃圾回收 作用域在函数定义时就已经确定了,而不是在函数调用时确定

    70830

    《前端5分钟》之迭代器模式的N+1种应用场景

    这篇文章是笔者写设计模式专题的第二篇文章,也是基于工作中的总结和提炼,在实际应用场景中都会大量使用,至于为什么要写设计模式,主要是为了提高团队代码质量和可维护性,后续会继续推出设计模式相关的文章,供大家参考和学习...你将学到 迭代器模式的含义 实现一个数组迭代器 实现一个对象迭代器 实现路径查找/赋值迭代器 如何用迭代器的思想解决分支循环嵌套问题 实现一个图片播放器 ?...正文 1.迭代器的含义 迭代器模式主要的思想就是在不暴露对象内部结构的同时可以按照一定顺序访问对象内部的元素。...分支循环嵌套的问题主要是指在循环体中还需要进行额外的判断,如果判断条件变多,将会造成严重的性能开销问题,如下面的例子: // 数据分组 function group(name, num) {...100种,那么我们就要做100000*100种无用的分支判断,这样无疑会让你的代码在大数据下卡死。

    1.2K10

    深入理解JavaScript闭包之什么是闭包

    一个真实的面试场景 A: 什么是闭包 B: 函数 foo 内部声明了一个变量 a, 在函数外部是访问不到的,闭包就是可以使得在函数外部访问函数内部的变量 A:额,不太准确,那你说一下闭包有什么用途吧 B...首先解释5是从哪里来的,这个循环的终止条件是 i 不再 的值是5,因此,输出显示的是循环结束时 i 的最终值。 延迟函数的回调会在循环结束时才执行。...但是实际上,根据作用域的原理,尽管循环中的五个函数都是在各自迭代中分别定义的,但是他们都封闭在一个共享的全局作用域中,因此实际上只有一个 i。即所有函数共享一个 i 的引用。...这样修改之后,在每次迭代内使用 IIFE(立即执行函数)会为每个迭代都生成一个新的作用域,使得延迟函数的回调可以将新的作用域封闭在每个迭代内部,每个迭代内部都会含有一个具有正确值的变量可以访问。...为什么总是 JavaScript 中闭包的应用都有着关键词 “return”, javaScript 秘密花园 中有一段话解释到:闭包是JavaScript 一个非常重要的特性,这意味着当前作用域总是能够访问外部作用域的变量

    84830

    《TypeScript 中文入门教程》 2、变量声明

    变量声明 let和const是JavaScript里相对较新的变量声明方式。 像我们之前提到过的, let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。...下面我们会详细说明这些新的声明方式以及为什么推荐使用它们来代替 var。 如果你之前使用JavaScript时没有特别在意,那么这节内容会唤起你的回忆。...参数 i会覆盖for循环里的i,但是因为我们起了同样的名字,所以我们不用怎么改for循环体里的代码。 let声明 现在你已经知道了var存在一些问题,这恰好说明了为什么用let语句来声明变量。...块级作用域变量的获取 在我们最初谈及获取用var声明的变量时,我们简略地探究了一下在获取到了变量之后它的行为是怎样的。 直观地讲,每次进入一个作用域时,它创建了一个变量的 环境。...不仅是在循环里引入了一个新的变量环境,而是针对 每次迭代都会创建这样一个新作用域。 这就是我们在使用立即执行的函数表达式时做的事,所以在 setTimeout例子里我们仅使用let声明就可以了。

    95520
    领券