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