例1:varobj=newObject();varevents={m1:'clicked',m2:'changed'};for(vareinevents){(function(){varaValue=e;obj[e]=function(){//varaValue=e;console.log(events[aValue]);};}());};安慰。日志(obj.m1===obj.m2);//假对象.m1();//clickedobj.m2();//更改示例2:varobj=newObject();varevents={m1:'clicked',m2:'changed'};for(vareinevents){(function(){//varaValue=e;obj[e]=function(){varaValue=e;console.log(events[aValue]);};}());};console.log(obj.m1===obj.m2);//假对象.m1();//changedobj.m2();//changed参考答案:例1:falseclickedchanged例2:falsechangedchanged分析:上面两个例子中,除了varaValue=e;这句话以外位置不同:例1位于外层匿名函数,例2位于内层匿名函数,其他部分完全相同。为什么结果不同?例1:for循环的过程中,当时的e像照片一样被封存在aValue变量中(注意这里每次循环都会生成一个新的闭包,所以循环几次后会有几个aValues存在于同时,本例中有2个,它们的值分别为'm1'和'm2'),调用obj.m1()时,取的是闭包中的aValue,而不是当前的e。例2:循环结束后执行内层函数obj.m1和obj.m2,循环变量e的值为'm2'(注意e是for循环的循环变量,调用obj时.m1()和obj.m2(),for循环已经结束,所以它的循环变量e一直停留在'm2'),所以obj.m1和obj.m2中的局部变量aValue的值只有可以是“m2”。
