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>
  • 相关阅读:
    LeetCode 79. 单词搜索
    LeetCode 1143. 最长公共子序列
    LeetCode 55. 跳跃游戏
    LeetCode 48. 旋转图像
    LeetCode 93. 复原 IP 地址
    LeetCode 456. 132模式
    LeetCode 341. 扁平化嵌套列表迭代器
    LeetCode 73. 矩阵置零
    LeetCode 47. 全排列 II
    LeetCode 46. 全排列
  • 原文地址:https://www.cnblogs.com/meiyh/p/6428045.html
Copyright © 2011-2022 走看看