闭包试验

<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的拷贝。
}

posted @ 2012-11-16 18:43  积跬步  阅读(235)  评论(0编辑  收藏  举报