在循环内错误使用函数定义(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 就会调用时传进来的的当时值,这样在点击元素时,就能显示正确的序号。

相关推荐
1024肥宅2 分钟前
手写 EventEmitter:深入理解发布订阅模式
前端·javascript·eventbus
AI视觉网奇8 分钟前
Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr
开发语言·c++·算法
wjs202414 分钟前
并查集快速合并
开发语言
free-elcmacom14 分钟前
MATLAB与高等数学<1>一道曲面积分题的几何直观
开发语言·数学建模·matlab·高等数学
LaoZhangGong12314 分钟前
深度学习uip中的“psock.c和psock.h”
c语言·开发语言
Tony Bai16 分钟前
Go 安全新提案:runtime/secret 能否终结密钥残留的噩梦?
java·开发语言·jvm·安全·golang
pengzhuofan25 分钟前
Java演进与与工程师成长
java·开发语言
比昨天多敲两行26 分钟前
C++入门基础
开发语言·c++
月明长歌26 分钟前
再谈Java 继承与多态:从“能用”到“精通”,更深一层的原理与设计思维
java·开发语言
hoiii18737 分钟前
量子密钥分发密钥率仿真MATLAB实现
开发语言·matlab