var Liarry = document.getElementsByTagName('li');

/*
*方法一
*描述:自执行函数,将变量当参数传入(闭包的思想,保存当前的值)。
*/ for (var i = 0; i < Liarry.length; i++) {
(function (j){
Liarry[j].addEventListener('click', function () {
console.log(j);
})})(i);
} /*
*方法二
*描述:将变量值保存在当前的li对象中。
*/ for (var i = 0; i< Liarry.length; i++){
Liarry[i].index = i
Liarry[i].addEventListener('click', function () {
console.log(this.index)
})
} /*
*方法三
*描述:定义一个时间函数,将参数传入(本质是全局变量变为局部变量)
*/ for (var i = 0; i < Liarry.length; i++) {
clickEvent(i);
} function clickEvent(j) {
Liarry[j].addEventListener('click', function () {
console.log(j);
})
} /*
*方法四
*用let声明变量
*/ for (let i = 0; i < Liarry.length; i++){
Liarry[i].addEventListener('click', function () {
console.log(i);
});
} *阐述(个人理解,有不足的地方欢迎评论区走一波):
1、var 声明的变量存在变量提升,var 声明的是全局变量。当js引擎执行到for循环时,会给每一个li添加一个click事件,此时并未触发该事件,click的回调并没执行,回调中的i并没赋值,直到i等于length终止循环,当触发click,回调执行,i去获取值,此时的值被length覆盖。
2、let 块级作用域,不存在变量提升(js规定它声明的变量是唯一的)。每次循环js引擎会把变量i重新声明初始化一次,变量i的每一次赋值只作用域本次循环,所以值不一样。

var与let变量for遍历的问题的更多相关文章

  1. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  2. 111. for(元素变量x:遍历对象obj)

    package com.chongrui.test;/* * for(元素变量x:遍历对象obj){ * 引用X的java语句 *  * } *  *  * */public class test { ...

  3. 使用var声明的变量 和 直接赋值并未声明的变量的区别

    在看JS高级程序设计时忽然想到这个问题,众所周知,直接赋值一个变量而为声明,会产生一个全局变量(或者说是全局对象的属性),但用var声明的变量 和 直接赋值而并未声明的变量 都有哪些区别呢,这是我在百 ...

  4. 每个分组函数相当于一个for循环 将集合的变量不断遍历

    每个分组函数相当于一个for循环  将集合的变量不断遍历

  5. ES6之用let,const和用var来声明变量的区别

    var(掌握) 不区分变量和常量   用var声明的变量都是变量,都是可变的,我们可以随便对它进行运算操作.这样当多个人进行同一个项目时,区分变量和常量会越来越难,一不小心就会把设计为常量的数据更改了 ...

  6. 浅谈JS中 var let const 变量声明

    浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...

  7. var正在声明变量

    var正在声明变量也可以直接分配一个变量,而不在JS中声明它,但是这种变量在默认情况下是全局的.<!-/->是HTML中的注释,在JS中不起作用.它只是用来忽略无法识别脚本的浏览器的脚本内 ...

  8. js for循环,为什么一定要加var定义i变量

    我知道,有些人(譬如之前的我)写js的for循环时,都不习惯加上var,这当然是语法允许的.譬如下面. for(i=0;i<10;i++){//就不写成: var i=0 alert(i); } ...

  9. swift-var/let定义变量和常量

    // Playground - noun: a place where people can play import UIKit //--------------------------------- ...

随机推荐

  1. maven国内镜像、国内外仓库(直接下载jar)

    阿里: https://maven.aliyun.com/mvn/search 官方: http://repo.maven.apache.org/maven2/ maven仓库 阿里巴巴的镜像仓库, ...

  2. LocalDateTime自动转化格式

    开发中,遇到这样的问题.一个LocalDateTime类型的属性返回给前端是中间带T的格式,前端说转不了. 可以引入jackson包转换一下 <properties> <jackso ...

  3. Orchestrator MySQL主库故障切换的几种类型

    Orchestrator 对MySQL主库的故障切换分为自动切换和手动切换. 手动切换又分为recover.force-master-failover.force-master-takeover以及g ...

  4. leetcode 82 删除排序列表中的重复元素II

    与83类似,不过需要注意去除连续的重复片段的情况,如2 2 3 3这种情况,以及[1,1]这种情况下最终的cur为NULL,因此不能再令cur=cur->next; /** * Definiti ...

  5. 代码实现:输入3个数a,b,c,按大小顺序输出。

    import java.util.Arrays; import java.util.Scanner; //输入3个数a,b,c,按大小顺序输出. public class Test34 { publi ...

  6. [Flask]通过render_form快捷渲染表单

    依赖: Bootstrap-Flask 实例化方式与flask_bootstrap相同. 关于render_form(): Bootstrap-Flask内置了两个用于渲染WTForms表单类的宏,r ...

  7. [mysql]设置创建时间,更新时间未生效

    问题描述: 新增一条case,create_time没有自动生成创建时间,值为空 原因 : create_time字段类型是DateTime(错误)而不是TIMESTAMP(正确)  解决办法: 把c ...

  8. 【8】ie css hack

    1. "\9"   IE6/IE7/IE8/IE9/IE10都生效 "\0"   IE8/IE9/IE10都生效,是IE8/9/10的hack "\9 ...

  9. 阶段3 2.Spring_10.Spring中事务控制_6 spring基于XML的声明式事务控制-配置步骤

    环境搭建 新建工程 把对应的依赖复制过来 src下内容复制 配置spring中的声明事物 找到bean.xml开始配置 配置事物管理器 里面需要注入DataSource 2-配置事物通知 需要先导入事 ...

  10. 四十二:数据库之SQLAlchemy之数据查询懒加载技术

    懒加载在一对多,或者多对多的时候,如果要获取多的这一部分的数据的时候,通过一个relationship定义好对应关系就可以全部获取,此时获取到的数据是list,但是有时候不想获取全部数据,如果要进行数 ...