闭包的生存周期

 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>
原文地址:https://www.cnblogs.com/meiyh/p/6428045.html