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

考虑下面代码:

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了(对于所有的元素)。

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

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 就会调用时传进来的的当时值,这样在点击元素时,就能显示正确的序号。

作者:王大冶
链接:https://juejin.cn/post/7161959592967012366

相关推荐

  1. 循环错误使用函数定义js问题

    2023-12-13 16:24:02       40 阅读
  2. c# 循环使用匿名函数关联变量问题

    2023-12-13 16:24:02       19 阅读
  3. 优化for循环js问题

    2023-12-13 16:24:02       42 阅读
  4. 函数节流(js问题

    2023-12-13 16:24:02       42 阅读
  5. C语言如何避免循环初值错误问题

    2023-12-13 16:24:02       21 阅读
  6. 定义函数使用

    2023-12-13 16:24:02       16 阅读
  7. 变量和函数提升(js问题

    2023-12-13 16:24:02       41 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-13 16:24:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-13 16:24:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-13 16:24:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-13 16:24:02       20 阅读

热门阅读

  1. 【Docker】Docker的安装部署及优化详解

    2023-12-13 16:24:02       34 阅读
  2. 验证回文串算法(leetcode第125题)

    2023-12-13 16:24:02       40 阅读
  3. (第56天)分区表转换之复合分区

    2023-12-13 16:24:02       40 阅读
  4. WPF的WebBrowser控件

    2023-12-13 16:24:02       29 阅读
  5. 卷积的计算 - numpy的实现 2

    2023-12-13 16:24:02       29 阅读
  6. jquery实现Ajax请求

    2023-12-13 16:24:02       37 阅读
  7. YOLOv8分割训练及分割半自动标注

    2023-12-13 16:24:02       38 阅读