js中for循环闭包问题记录

<script type="text/javascript">
window.onload = function(){
var aImg = document.getElementsByTagName(‘img‘);

for(var i=0;i<3;i++){

    alert(i); //0,1,2

  aImg[i].onclick = function(){

    alert(i); //3

    }

  }

   alert(i);//循环外值依旧为3

}

</script>
  ......以下内容省略.......

运行代码之后发现红色部分输出的结果不同,这是因为js每执行一条循环语句随着i的增加,在内存中会将此整个onclick匿名函数作为字符串加载进内存,循环了3次所以i值变化为0,1,2当然匿名函数作为字符串也被加载了3次(其实是函数还未被解析作为字符串存储于堆内存中,这里加载的只是它的地址值,即aImg[0].onclick=address,aImg[1]=address,aImg[2]=address的点击事件都指向同一个地址address),当点击事件触发函数时会根据address找到触发函数,由于函数中没有i的定义,所以此时它会顺着作用域链找到父级函数的i值,由于for循环不是一个块级作用域,所以其i值相当于在window.onload匿名函数中声明(在for循环结束时依然可以输出i值),所以当onclick匿名函数找到i值时它已经变成了3.

时间: 2024-12-31 12:28:24

js中for循环闭包问题记录的相关文章

js中的循环语句

js中的循环语句可分为三种:1.while:2.do……while:3.for. while的语法为 while (exp) {    //statements;} var a=1,b=0; while(a<=1000){ if(a%2==0){ if(b%20==0) { document.write("<br>第"+parseInt(b/20+1)+"行偶数"); } document.write(a+"&nbsp"

JS中的循环

1.循环的概念和意义 循环语句 循环的意义: 计算机是个傻子,没有七情六欲,不会有人类的感性和思考.当你问他爱吃啥,他不知道,当问他喜欢什么颜色,他也不知道.那我们要计算机干啥呢? 从远古时期讲,所谓计算机并没有现在这么牛的功能,游戏电影,都是不可能的.只能干一件事:计算.那么什么是计算呢,为什么不自己计算呢? 所谓计算,就是数据的累加,比如1加到100,这些累加都是重复性的工作,当人处理这些重复性的工作时,速度有限,但是计算机处理起来奇快无比,这就是计算机的价值所在. 发展到今天也是一样,当我

js中for循环使用方法详解

大家好,今天我们来聊聊js中for循环,咱废话不多说直接进入主题: for语句是循环语句的一种用于创建一个循环,这是在开发中最常见的循环: for的语法for(初始值:条件判断:自身的改变){要重复执行的代码}: <script> var a=0;//定义一个变量 //循环6次,每次都执行a+1 for (i=0;i<6;i++){ a=a+1; console.log(a)//拿出a值看下变化过程 } </script> 下面我们来看下a的结果会是什么: 这就是a的变化过程

解析js中作用域、闭包——从一道经典的面试题开始

如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎么写,是不是这样? 可是结果呢,弹出来的都是10,为啥? var i,a for(i=0;i<10;i++){ a=document.createElement('a') a.innerHTML=i+'<br>' a.addEventListener('click',function(eve

JS中的循环结构、循环嵌套以及函数介绍

[循环结构的步骤]    *①声明循环变量    *②判断循环条件    *③执行循环体(while的{}中的所有代码)操作     *④更新循环变量    *     * 然后,循环执行②③④    *     *     * [JS中循环条件支持的数据类型]    * ①boolean:true 真     false   假    * ②string: 非空字符串为真       空字符串为假    * ③null/NaN/undefined:  全为假    * ④object:全为真 

JS中的循环嵌套 BOM函数

[嵌套循环特点]                           外层循环转一次,内层循环转一圈              外层循环控制行数,内层循环控制每行元素个数             [做图形题思路]              1确定图形一共几行  极为外层的循环的次数             2确定每行有几种元素,代表有几个内层循环.             3 确定每种元素的个数,即为每个内层循环的次数                 tips:通常:找出每种元素个数,与行号的关

简单聊一聊JS中的循环引用及问题

本文主要从 JS 中为什么会出现循环引用,垃圾回收策略中引用计数为什么有很大的问题,以及循环引用时的对象在使用 JSON.stringify 时为什么会报错,怎样解决这个问题简单谈谈自己的一些理解. 1. 什么是循环引用 当对象 1 中的某个属性指向对象 2,对象 2 中的某个属性指向对象 1 就会出现循环引用,(当然不止这一种情况,不过原理是一样的)下面通过代码和内存示意图来说明一下. function circularReference() { let obj1 = { }; let obj

js的for循环闭包问题

一个简单的例子,如果想循环输出数组中的每一个数值我们可以利用for循环来输出例如: <script type="text/javascript"> var arr=["a","b","c","d","e"]; for (var i=0;i<arr.length;i++){ document.write(arr[i]); } </script> 这是最常见不过

JS实现停留几秒sleep,Js中for循环的阻塞机制,setTimeout延迟执行

//第一种,使用while循环 function sleep(delay) { var start = (new Date()).getTime(); while((new Date()).getTime() - start < delay) { continue; } } //或者使用for循环 function sleep(delay) { for(var t = Date.now(); Date.now() - t <= d;); } 这种实现方式是利用一个伪死循环阻塞主线程.因为JS是