var与let变量for遍历的问题
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遍历的问题的更多相关文章
- JavaScript var关键字、变量的状态、异常处理、命名规范等介绍
本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...
- 111. for(元素变量x:遍历对象obj)
package com.chongrui.test;/* * for(元素变量x:遍历对象obj){ * 引用X的java语句 * * } * * * */public class test { ...
- 使用var声明的变量 和 直接赋值并未声明的变量的区别
在看JS高级程序设计时忽然想到这个问题,众所周知,直接赋值一个变量而为声明,会产生一个全局变量(或者说是全局对象的属性),但用var声明的变量 和 直接赋值而并未声明的变量 都有哪些区别呢,这是我在百 ...
- 每个分组函数相当于一个for循环 将集合的变量不断遍历
每个分组函数相当于一个for循环 将集合的变量不断遍历
- ES6之用let,const和用var来声明变量的区别
var(掌握) 不区分变量和常量 用var声明的变量都是变量,都是可变的,我们可以随便对它进行运算操作.这样当多个人进行同一个项目时,区分变量和常量会越来越难,一不小心就会把设计为常量的数据更改了 ...
- 浅谈JS中 var let const 变量声明
浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...
- var正在声明变量
var正在声明变量也可以直接分配一个变量,而不在JS中声明它,但是这种变量在默认情况下是全局的.<!-/->是HTML中的注释,在JS中不起作用.它只是用来忽略无法识别脚本的浏览器的脚本内 ...
- js for循环,为什么一定要加var定义i变量
我知道,有些人(譬如之前的我)写js的for循环时,都不习惯加上var,这当然是语法允许的.譬如下面. for(i=0;i<10;i++){//就不写成: var i=0 alert(i); } ...
- swift-var/let定义变量和常量
// Playground - noun: a place where people can play import UIKit //--------------------------------- ...
随机推荐
- Linux上python3的安装和使用
centos7默认是装有python的,咱们先看一下 #检查python版本 [root@oldboy_python ~ 17:23:54]#python -V Python 2.7.5 但是 pyt ...
- RabbitMq运行原理浅析
转载:https://blog.csdn.net/Evankaka/article/details/80977027 1.RabbitMq简介 AMQP,即Advanced Message Q ...
- 三、smarty--变量调节器(修改器)
变量调节器(修改器) 作用: 1. 从PHP中分配个模板的变量 2. 需要模板中对变量在输出前进行处理 3. 处理方式就是使用“函数” 4. 在smarty3中可以直接调用到PHP的函数 5. ...
- 非均匀B样条离散点的加密与平滑
非均匀B样条离散点的加密与平滑 离散点的预处理是点云网格化很关键的一步,主要就是离散点的平滑.孔洞修补:本文是基于非均匀B样条基函数进行离散点云的加密和平滑的,一下为初步实现结果. 算法步骤: 1.数 ...
- electron-Menu创建原生应用菜单和上下文菜单。
当在MacOS.Windows.Linux中使用menu设置程序菜单时,会设置在各个程序窗体的顶层. Note: 如果没有在app中设置一个菜单,系统会自动生成一个默认菜单, 默认生成的菜单中包含了一 ...
- doctype是什么?
1.<!doctype>声明必须处于HTML文档的头部,在<html>标签之前,HTML5中不区分大小写 2.<!doctype>声明不是一个HTML标签,是一个用 ...
- 【MAC】图片编辑工具-合成图片
MAC中和wIn环境中画图一样的工具,可以对图片进行编辑 step1: step2: step3: 从工具栏中选择你要使用的工具,进行对应的操作. step4: 合成图片: 效果如图:
- ControlTemplate in WPF —— DatePicker
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...
- Python学习之==>迭代器
一.概要 在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set ...
- 启动elasticsearch-head显示集群健康值:未连接
ES启动后,进行es header访问的话,使用localhost:9100会显示集群健康值未连接 2种情况(均为windows10环境下): 1:未在elasticsearch-6.8.0\conf ...