zoukankan      html  css  js  c++  java
  • 闭包试验

    <div id="test" style="background-color:blue;">123</div>
    <script type="text/javascript">
        var obj = document.getElementById('test');
        var items = ['click','mouseover'];
        for(var i = 0; i<items.length; i++){
            var item = items[i];
            obj['on'+item] = function(){console.log(item);}//匿名函数x
        }
    </script>
    测试后得到的结果很可能不是你想要的,原因就在于函数x的作用域链中都保存着父函数的活动对象(在这里应该是一个全局的环境),闭包被调用的时候,其中的item保持着循环中最后一次的赋值。

    可以将for循环如下更改:
    for(var i = 0; i<items.length; i++){       
                (function(a){//外层闭包y          
                    var item = items[i];
                    obj['on'+item] = function(){console.log(item);}//匿名函数x
                })();
    }
    这个可以输出想要的结果,一开始让我感到疑惑的是对于函数y,外层就是for循环,那么y作用域中的i应该保持for循环的最后一次赋值(这句话是没错的),那应该都是1(这里就错了)
    (function(){})()是立即执行的函数,也就是i=0的时候,y立即执行了,那么i的最后一次赋值就是0;当i=1的时候,i的最后一次赋值是1,y内的i也是1(闭包可以访问外部的变量),也就是说时刻保持着 i 最新的状态,所以传参数也是可行的。
    我想,y 存在的价值就是为 x 提供独特的活动对象--作用域--数据访问权限。

    for(var i = 0; i<items.length; i++){
            var item = items[i];
            (function(a){           
                console.log(a);
                obj['on'+a] = function(){console.log(a);}
            })(item);//参数是按值传递的,每次保存着不同的item的拷贝。
    }

  • 相关阅读:
    总结第十天
    总结第九天
    总结第八天
    总结第七天
    总结第六天
    总结第五天
    总结第四天
    总结第三天
    总结第二天
    每日站立会议(六)
  • 原文地址:https://www.cnblogs.com/cy056/p/2773771.html
Copyright © 2011-2022 走看看