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

js动态绑定事件,无法使用for循环中变量i问题

❝小闫语录:我一直在幻想,那些伟大预言家都来自未来,那些畅销小说家都是真实经历过... ❞ 每天不是在写 bug,就是在解 bug 路上~更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选...』 1.问题描述 在一个 for 循环中,我动态给一堆 a 标签绑定 onclick 事件时,发现点击事件不正确。...但是上述代码点击每一个链接总是弹出一个值,而且还是个不正常值。之所以说它不正常,是因为上面我获取到了 5 个标签,正常下标应该到 4 结束,但是总是弹出 5 ????...调用时,发现内部没有定义变量 i ,所以就去外面找一下,发现外层有,就取外层值了,但是为什么是 5 呢?...那是因为 for 循环结束条件是 i 不满足 i<5 ,那么结束后变量 i 值就是 5,匿名函数到外层取值正好取到了它。

3.9K10

关于for循环中变量定义位置

问题 最近跟同事讨论for循环中变量定义在哪里问题。...同事意思是说如果照上面那样写因为每循环一次,obj变量就要在堆栈上分配一段空间,造成浪费。...看2段IL代码,我们很容易就发现,其实不管是哪种写法,生成IL几乎是一样,不同只是locals init初始化变量顺序先后差异。对于第一种写法IL并没有在循环体内去每次都声明obj变量。...但是第二种写法obj变量必定还保持着最后一次循环所创建对象。这个对象释放会被限制,且后面的新人接手你代码时容易误操作了这个变量,造成不必要bug。...解惑 @钧梓昊逑 方法内部临时变量是在进入方法时就在栈上分配,通过栈顶指针移动实现变量分配与回收,效率是极高,对于你说内存浪费,的确会有,这也是为什么推荐写小方法原因。

1.3K30
您找到你想要的搜索结果了吗?
是的
没有找到

环中使用goroutine引用临时变量

5 个 5,因为在 for 循环 i++ 会执行快一些,所以在最后打印结果都是 5 这个答案不能说不对,因为真的执行的话大概率也是这个结果,但是不全。...因为这里本质上是有数据竞争,在新启动 goroutine 当中读取 i 值,在 main 中写入,导致出现了 data race,这个结果应该是不可预知,因为我们不能假定 goroutine 中...print 就一定比外面的 i++ 慢,习惯性做这种假设在并发编程中是很有可能会出问题 正确示例:将 i 作为参数传入即可,这样每个 goroutine 拿到都是拷贝后数据 func main(...5) for i := 0; i < 5; i++ { go func(i int) { fmt.Println(i) wg.Done() }(i) } wg.Wait()} 2.3 引起变量共享...nil { res <- er } else { go func() { // 下面的这个函数在执行时,是使用err进行判断,但是err变量是个共享变量

73800

【SQL】小心在循环中声明变量——浅析SQL变量作用域

@s += 's' PRINT @s SET @i += 1 END --执行结果: s ss sss 所以到这里能得出一个结论: 循环中变量只会声明一次,并在之后一直沿用...理解这一点很重要,因为这与C#等编译语言非常不同,C#中每一圈声明变量都相当于重新建一个,与上一圈毫无关系,但在sql中不能这么思考。...其实这个问题本质上是一个变量作用域问题,只不过SQL中变量作用域,与C#等语言按语句块划分不一样,SQL变量作用域是【批】,这一点在MSDN中有说。...原因就在于声明语句比较特殊,它并不依赖位置,系统“见到”就算数,所以不管变量在多深语句块中声明,它在本批接下来语句中都是有效。...回到开头问题,现在我们清楚,虽然变量在循环中声明,但它并不会被多次执行,甚至不是在第1圈时候执行,而是在某个时机由系统将所有声明统一执行,大概类似C#静态字段,不管定义在哪里,CLR会确保在使用该类前完成初始化

1.7K20

你不知道JS环中

你知道 JS 中断循环有哪些吗?除了 for 循环 break,还有哪些可以中断循环?接下来笔者以实际业务例子,分享几种能中断循环方案,希望你在实际业务中能用得上。...forEach 在实际业务中你可能会写以下业务代码,举个栗子,在一个循环表单域中,你需要内容为空,就禁止提交 // 1.js const shopList = [{title: 'Apple', price...: 10}, {title: 'banana', price: ''},{title: 'orange', price: 5}] 以上是一组数组源,于是你思路可能会这样 // 1.js const...于是中断循环还有... while 循环中断 ... const hasPriceEmpty = (arr) => { let bool = false; // 默认都不是空 let index...源码地址:https://github.com/maicFir/lessonNote-js/tree/master/lessonNote-js/js/01

2.1K10

JS环中使用async、await正确姿势

概览(循环方式 - 常用) for map forEach filter 声明遍历数组和异步方法 声明一个数组:⬇️ const skills = ['js', 'vue', 'node',...reject) => { setTimeout(() => { resolve(value) }, 1000) }) } for 循环中使用 由于for循环并非函数...上述结果意味着for循环中有异步代码,是可以等到for循环中异步代码完全跑完之后再执行for循环后面的代码。 但是他不能处理回调循环,如forEach、map、filter等,下面具体分析。...' 'vue' 'node' 'react' 'End' 实际结果 在forEach循环等待异步结果返回之前就执行了console.log('end') 'Start' 'End' 'js' '...console.log(res) console.log('end') } test() 预期结果: start [ 'vue', 'react' ] end 实际结果: [ 'js

3.4K40

Js变量

Js变量:  1:如果在var中没有初始化变量值,则默认为undefined.  2:可以不用var来申明一个变量,但是在过程级中申明一个变量时,就必须用var.   ...var bestAge = null;  4:如果声明了一个变量但没有对其赋值,该变量存在,其值为Jscript 值 undefined。下面给出示例。    ...var currentCount  5: 在 JScript 中 null 和 undefined 主要区别是 null 操作象数字 0,    而 undefined 操作象特殊值NaN (不是一个数字...js数据类型  1:Jscript 有三种主要数据类型、两种复合数据类型和两种特殊数据类型    主要(基本)数据类型是: 字符串 数值 布尔    复合(引用)数据类型是: 对象 数组    特殊数据类型是...: Null Undefined  2:测试是否已经声明变量 x :    if (typeof(x) == "undefined")      // 作某些操作 js内置对象  1:Jscript

12.8K60

环中异步&&循环中闭包

,所以到这了上面的问题 使用var 定义变量时候,作用域是在foo函数下,在for循环外部,在整个循环中是全局,每一次循环实际上是为index赋值,循环一次赋值一次,5次循环完成,index最后结果赋值就为...5;就是被最终赋值index,就是5; let作用局块级作用局,index作用域在for循环内部,即每次循环index作用域就是本次循环,下一次循环重新定义变量index;所以index每次循环输出都不同...fun中局部变量j,所以当fun执行完毕后,变量j不会被释放,这就形成了闭包 当然我们可以对此进行一下优化 const array = [1, 2, 3, 4, 5] function...,结果是相同 总结 for循环本身是同步执行,当在for循环中遇到了异步逻辑,异步就会进入异步队列,当for循环执行结束后,才会执行异步队列 当异步函数依赖于for循环中索引时(一定是存在依赖关系...,不然不会再循环中调动异步函数)要考虑作用域问题, 在ES6中使用let是最佳选择, 当使用var时,可以考虑再引入一个索引来替代for循环中索引,新索引逻辑要在异步中处理 也可以使用闭包,模拟实现

1.6K20

JS】255- 如何在 JS环中正确使用 async 与 await

引言 async / await是ES7重要特性之一,也是目前社区里公认优秀异步解决方案。...功能完整度与使用便利度一直是相互博弈,很多框架思想不同开源版本,几乎都是把功能完整度与便利度按照不同比例混合结果。...那么回到 async/await 它解决问题是回调地狱带来灾难: a(() => { b(() => { c(); }); }); 为了减少嵌套结构太多对大脑造成冲击,async...而且这个转换还是隐形,所以许多时候,我们倾向于忽略它,所以造成了语法糖滥用。...理解语法糖 虽然要正确理解 async/await 真实效果比较反人类,但为了清爽代码结构,以及防止写出低性能代码,还是挺有必要认真理解 async/await 带来改变。

2.3K40

html js 全局 变量,JS定义全局变量

【实例名称】 定义全局变量 【实例描述】 在高级开发语言(如c#、Java)中可以很方便地使用“public”等关键字,定义应用程序中全局变量,但JaVascript变量只能存在于当前方法中。...本例通过一个简单方法实现全局变量定义。...”;’); //设置全局变量值 alert(varText); //显示全局变量值 【运行效果】 【难点剖析】 本例重点是“window.execscript”方法,execscript所执行脚本是针对整个全局域...将“varText”变量设置为window对象属性,则在全局中都可以调用此变量。...【源码下载】 为了JS代码准确性,请点击:定义全局变量 进行本实例源码下载 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134413.html原文链接:https

15.6K20

理解js变量提升

深刻理解变量提升 当执行 JS 代码时,会生成执行环境,只要代码不是写在函数中,就是在全局执行环境中,函数中代码会产生函数执行环境,只此两种执行环境。...{ console.log('call b') } 想必以上输出大家肯定都已经明白了,这是因为函数和变量提升原因。...通常提升解释是说将声明代码移动到了顶部,这其实没有什么错误,便于大家理解。但是更准确解释应该是:在生成执行环境时,会有两个阶段。...第一个阶段是创建阶段,JS 解释器会找出需要提升变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined,所以在第二个阶段,也就是代码执行阶段...在提升过程中,相同函数会覆盖上一个函数,并且函数优先于变量提升 b() // call b second function b() { console.log('call b fist')

5.5K20

JS 变量提升

今天去面试了,总体感觉很不错,整个公司还有人气氛都很棒,希望能顺利通过。 问到 JS 一些细节问题时候发挥比较糟糕,有些是知道反应得太慢,有些是压根没接触过,还是积累太少了。...这篇 JS 变量提升问题就是从没有接触过,网上一搜一大把,实在是不应该。为了不给信息爆炸添砖加瓦。。。照例尝试就这个问题扯一些别的理解。...,但对变量提升具体行为则不了解了。...在蝴蝶书里有一笔带过提了一句“通常编写代码提倡把变量声明尽量贴近变量使用位置,以提供上下文参考,但 Javascript 没有块级作用域,所以反而推荐在函数顶部给出所有用到变量声明。”...因此才会有前面蝴蝶书那一段话,建议把函数内用到所有变量声明写在函数开头。

6.9K20

如何在 JS环中正确使用 async 与 await

在 for 循环中使用 await 首先定义一个存放水果数组: const fruitsToGet = [“apple”, “grape”, “pear”]; 循环遍历这个数组: const forLoop...} console.log('End') } 在for循环中,过上使用getNumFruit来获取每个水果数量,并将数量打印到控制台。...这意味着for循环中await 应该按顺序执行。 结果正如你所预料那样。 “Start”; “Apple: 27”; “Grape: 0”; “Pear: 14”; “End”; ?...在接下来几节中,我们将研究await 如何影响forEach、map和filter。 在 forEach 循环中使用 await 首先,使用 forEach 对数组进行遍历。...在 reduce 循环中使用 await 如果想要计算 fruitBastet中水果总数。 通常,你可以使用reduce循环遍历数组并将数字相加。

4.5K20

Js 数组深拷贝及 splice() 在 for 循环中使用整理、建议

背景 最近在涉猎 【React】 前端框架知识时; 更多精力会放在对 JS 数据处理上 并且, 在业务中会经常使用数组操作 显然, 对不熟悉前端开发小伙伴,会很容易入坑 —— 尤其是对数组拷贝以及...可以参考这篇介绍比较详细文章 —— 【js 实现数组浅拷贝和深拷贝】 ---- 二....[splice() 在 for 循环中使用注意] 首先,这个问题是鄙人在进行 SKU 数组 for 循环遍历 过程中使用splice剥离元素时发现 因为注意到,剥离元素后,总会跳过一个元素 幸亏多加瞅了几眼数据结果才发现有问题...感觉这是一个很容易忽略点 直接说解决方法吧,那就是: "在使用 splice 下一句,改一下循环变量值 !"...鄙人借鉴文章 —— 【JS splice() 方法在 for 循环中使用可能会遇到坑】 [参考文章] 【JavaScript 之 对象/ JSON /数组】 【JS 中深拷贝数组、对象、对象数组方法

2.2K20

js数据_变量_内存

* 存储于内存中代表特定信息'东东', 本质就是0101二进制 * 具有可读和可传递基本特性 * 万物(一切)皆数据, 函数也是数据 * 程序中所有操作目标: 数据 * 算术运算 * 逻辑运算 *...* 内存条通电后产生存储空间(临时) * 产生和死亡: 内存条(集成电路板)==>通电==>产生一定容量存储空间==>存储各种数据==>断电==>内存全部消失 * 内存空间是临时, 而硬盘空间是持久...* 一块内存包含2个数据 * 内部存储数据(一般数据/地址数据) * 内存地址值数据 * 内存分类 * 栈: 全局变量, 局部变量 (空间较小) * 堆: 对象 (空间较大) 3....什么是变量? * 值可以变化量, 由变量名与变量值组成 * 一个变量对应一块小内存, 变量名用来查找到内存, 变量值就是内存中保存内容 4....内存,数据, 变量三者之间关系 * 内存是一个容器, 用来存储程序运行需要操作数据 * 变量是内存标识, 我们通过变量找到对应内存, 进而操作(读/写)内存中数据 --> <script type

3.5K00

js数据_变量_内存

* 存储于内存中代表特定信息'东东', 本质就是0101二进制 * 具有可读和可传递基本特性 * 万物(一切)皆数据, 函数也是数据 * 程序中所有操作目标: 数据 * 算术运算 * 逻辑运算 *...* 内存条通电后产生存储空间(临时) * 产生和死亡: 内存条(集成电路板)==>通电==>产生一定容量存储空间==>存储各种数据==>断电==>内存全部消失 * 内存空间是临时, 而硬盘空间是持久...* 一块内存包含2个数据 * 内部存储数据(一般数据/地址数据) * 内存地址值数据 * 内存分类 * 栈: 全局变量, 局部变量 (空间较小) * 堆: 对象 (空间较大) 3....什么是变量? * 值可以变化量, 由变量名与变量值组成 * 一个变量对应一块小内存, 变量名用来查找到内存, 变量值就是内存中保存内容 4....内存,数据, 变量三者之间关系 * 内存是一个容器, 用来存储程序运行需要操作数据 * 变量是内存标识, 我们通过变量找到对应内存, 进而操作(读/写)内存中数据 --> <script type

3.1K00
领券