在循环内错误使用函数定义(js的问题)

考虑下面代码:

html 复制代码
var elements = document.getElementsByTagName('input');
var n = elements.length;    // Assume we have 10 elements for this example
for (var i = 0; i < n; i++) {
    elements[i].onclick = function() {
        console.log("This is element #" + i);
    };
}

根据上面的代码,如果有10input 元素,点击任何一个都会显示 "This is element #10"。 这是因为,当任何一个元素的onclick被调用时,上面的for循环已经结束,i的值已经是10了(对于所有的元素)。

我们可以像下面这样来解决这个问题:

html 复制代码
var elements = document.getElementsByTagName('input');
var n = elements.length;   
var makeHandler = function(num) { 
     return function() {  
         console.log("This is element #" + num);
     };
};
for (var i = 0; i < n; i++) {
    elements[i].onclick = makeHandler(i+1);
}

makeHandler 是一个外部函数,并返回一个内部函数,这样就会形成一个闭包,num 就会调用时传进来的的当时值,这样在点击元素时,就能显示正确的序号。

相关推荐
全栈老石2 分钟前
手写一个无限画布 #2:渲染层的博弈:Canvas 还是 WebGL ?
javascript·canvas
你怎么知道我是队长4 分钟前
前端学习---HTML---标签属性
前端·学习·html
LawrenceLan4 分钟前
30.Flutter 零基础入门(三十):GridView 网格布局 —— 九宫格与商品列表必学
开发语言·前端·flutter·dart
yoyo君~4 分钟前
从内存管理到并发架构:C++ 核心内功修炼指南
开发语言·c++·学习·无人机
汐瀼7 分钟前
【AI个人学习】npm本地安装claude code白嫖minimax模型
前端·学习·npm
2501_941982059 分钟前
告别手动,Java 自动化调用企微外部群的深度实践
开发语言·python
小岛前端10 分钟前
从 Vite 到 Vize:Vue 开发体验的下一次飞跃
前端·vue.js
芝士雪豹只抽瑞克五11 分钟前
Tomcat Web应用服务器笔记
前端·笔记·tomcat
阿珊和她的猫13 分钟前
实现网页锚点功能的技术指南
前端·javascript·vue.js·状态模式
这波不该贪内存的13 分钟前
Linux文件编程:流与操作全解析
java·服务器·前端