zoukankan      html  css  js  c++  java
  • JS高级——闭包练习

    从上篇文章我们知道与浏览器的交互操作如鼠标点击,都会被放入任务队列中,而放入到任务队列中是必须等到主线程的任务都执行完之后才能执行,故而我们有时利用for循环给dom注册事件时候,难以获取for循环中对应的i值,可是我们可以利用闭包啊

    方法1:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            div{
                height: 30px;
                border: 1px solid #000;
                margin: 5px;
            }
        </style>
    </head>
    <body>
    <div>我是第1个div</div>
    <div>我是第2个div</div>
    <div>我是第3个div</div>
    <div>我是第4个div</div>
    <div>我是第5个div</div>
    <div>我是第6个div</div>
    <div>我是第7个div</div>
    <div>我是第8个div</div>
    <div>我是第9个div</div>
    <div>我是第10个div</div>
    <script>
    var divs=document.getElementsByTagName('div');
    for (var i = 0; i < divs.length; i++) {
        function foo(j) {
            return function () {
                console.log('这是第'+(j+1)+'个div');
            }
        }
        var f=foo(i);
        divs[i].onclick=f;
    }
    </script>
    </body>
    </html>

    方法2:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            div{
                height: 30px;
                border: 1px solid #000;
                margin: 5px;
            }
        </style>
    </head>
    <body>
    <div>我是第1个div</div>
    <div>我是第2个div</div>
    <div>我是第3个div</div>
    <div>我是第4个div</div>
    <div>我是第5个div</div>
    <div>我是第6个div</div>
    <div>我是第7个div</div>
    <div>我是第8个div</div>
    <div>我是第9个div</div>
    <div>我是第10个div</div>
    <script>
        var divs=document.getElementsByTagName('div');
        for (var i = 0; i < divs.length; i++) {
            divs[i].onclick=function (j) {
                return function () {
                    console.log('这是第'+(j+1)+'个div');
                }
            }(i);
        }
    </script>
    </body>
    </html>

    在方法2中我们运用了立即执行函数表达式(函数自调用)方法,函数自调用的形式还有如下方法:

    <script>
        (function () {
            console.log(0);
        })();
        +function () {
            console.log(1);
        }();
        -function () {
            console.log();
        }();
    </script>
  • 相关阅读:
    git提交步骤
    封装ajax方法
    review的一个收获popstate,addEventListener:false ,split,jquery cache
    y=y||'world'与y=y?y:'world'
    toString()和toLocaleString()有什么区别
    0,null,undefined,[],{},'',false之间的关系
    小白封装小程序的公共方法时一些笔记
    小程序的一个tab切换
    MVC源码分析
    MVC源码解析
  • 原文地址:https://www.cnblogs.com/wuqiuxue/p/8342395.html
Copyright © 2011-2022 走看看