zoukankan      html  css  js  c++  java
  • 闭包的生存周期

     var Type = {};
           
            for (var i = 0, type; type = ['String', 'Array', 'Number'][i++];) {
                (function (type) {
                    Type['is' + type] = function (obj) {
                        return Object.prototype.toString.call(obj)==='[object '+type+']';
                    }
                })(type);
            }  
            console.log(Type.isArray([]));    //true
            console.log(Type.isString(234));  //false
    • 利用闭包我们可以完成很多工作,下面这个比较经典的应用。
    • 点击不同的Div会弹出对应的下标
     <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>4</div> 
        
        <script type="text/javascript">
            var nodes = document.getElementsByTagName('div');
            for (var i = 0; i < nodes.length; i++) {
                nodes[i].onclick = function () {
                    alert(i);
                } 
            }
        </script>
    • 经过测试你会发现上面的代码随便点击哪个Div都弹出4。这是因为onclick事件是异步触发的,当事件被触发的时候,for循环已经结束,此时的变量 i 已经变为4.
    • 解决办法就是用到闭包将循环的i值都封闭起来。如下:
    <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>4</div> 
        
        <script type="text/javascript">
            var nodes = document.getElementsByTagName('div');
            for (var i = 0; i < nodes.length; i++) {
                (function (i) {
                    nodes[i].onclick = function () {
                        alert(i);
                    }
                })(i);
            }
        </script>
  • 相关阅读:
    2、ansilbe常用模块详解及inventory介绍
    1、Ansible简介及简单安装、使用
    dhcp、tftp及pxe简介
    php-fpm常见错误
    php之编译安装
    nginx之常见错误
    ssh之秘钥登陆
    MySQL之主从复制
    Python之虚拟环境
    php调试工具之firePHP
  • 原文地址:https://www.cnblogs.com/meiyh/p/6428045.html
Copyright © 2011-2022 走看看