JavaScript的for循环闭包

作者: _LG_ | 来源:发表于2016-11-28 23:06 被阅读69次
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
    <ul>
        <li>第一个</li>
        <li>第二个</li>
        <li>第三个</li>
        <li>第四个</li>
    </ul>
</body>
<script>
    var nodeList = document.getElementsByTagName('li');

    for (var i = 0; i < nodeList.length; i++) {
        nodeList[i].onclick = function() {
            console.log(i);
        }
    }
</script>

</html>
result.png
此时当点击任意li时,控制台输出的都是4。onclick是个异步事件。而循环本身执行快的多,等到循化结束后i值为4,此时不管点击哪一个输出都是4。
for循环中的var改为let时,则正常输出。let是严格模式定义变量,每次循环的i的引用是不同的,能正确的把每次循环里面正确的i值传递到onclick里面,按for表达式let i = 0; i < nodeList.length; i++的定义,哪个标签被点击,就输出对应的i值。
 for (var i = 0; i < nodeList.length; i++) {
     nodeList[i].num = i;
     nodeList[i].onclick = function() {
         console.log(this.num);
     }
 }

li增加一个新的属性是num,此时的num并没有在onclick事件函数中,所以num属性直接被赋值为0,1,2,3,当事件函数值执行的时候,输出的是对应的li的num的值,而这个时候的num已经在上一步的时候被执行了。

for (var i = 0; i < nodeList.length; i++) {
    (function(i) {
        nodeList[i].onclick = function() {
            console.log(i);
        }
    })(i)
}

使用立即执行函数解决该问题。此时i输出的结果为0,1,2,3。
此外也可以使用增加属性的方法使得i的值理想输出。

相关文章

  • JS之闭包与IIFE

    本篇文章主要讨论了: JavaScript引擎 全局对象 闭包 循环 + 闭包 IIFE + 闭包 1.JavaS...

  • JavaScript的for循环闭包

    li增加一个新的属性是num,此时的num并没有在onclick事件函数中,所以num属性直接被赋值为0,1,2,...

  • JavaScript----闭包

    javascript之闭包 闭包的概念     闭包(closure)是 JavaScript 的一种语法特性。 ...

  • JavaScript闭包之for循环

    之前讲了最简单的闭包,然而闭包最经典的是那个for循环,几乎每一个想要理解闭包的都会遇到这个例子,每一个讲解闭包的...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • Swift入门二(对象函数)

    函数 闭包 GCD 尾随闭包 闭包循环引用解决(OC) 闭包循环引用解决(swift推荐) 面向对象 命名空间: ...

  • 你不知道的javascript--作用域闭包-3

    声明:以下内容摘自《你不知道的javascript》上卷一书的第5章的片段。 1.循环和闭包 要说明闭包,for循...

  • iOS闭包循环引用精讲

    iOS闭包循环引用精讲 iOS闭包循环引用精讲

  • javascript中闭包是什么

    javascript中闭包是什么 JavaScript 变量可以是局部变量或全局变量。私有变量可以用到闭包。闭包就...

网友评论

    本文标题:JavaScript的for循环闭包

    本文链接:https://www.haomeiwen.com/subject/iutpyttx.html