this.boxfun=function(){
for(let i=0;i< this.setdomobj.length;i++)
{
s=this.setdomobj[i];
r=this.setdomobj[i].getAttribute(this.getbute);
this.boxratio(s,r);
//窗口监听事件
window.addEventListener("resize",function(){
_this.boxratio(_this.setdomobj[i],r);
})
}
}
在for循环中窗口监听事件的_this.boxratio(_this.setdomobj[i],r);中的r值引用的是最后一次i的值,为什么不是1,2,3,4…呢?
因为在or循环r的时候,你并没有执行这个函数,这个函数是在点击的时候才执行的,当执行这个函数的时候,它发现它自己没有这个变量r,于是向它的作用域链中查找这个变量r,因为窗口事件调用r时这个r的时候已经for循环完了,所以储存在作用域链里面的i的值就是最后一个。
解决方法:将每次for循环中的变量r保存到某个地方。
this.boxfun=function(){
for(let i=0;i< this.setdomobj.length;i++)
{
s=this.setdomobj[i];
r=this.setdomobj[i].getAttribute(this.getbute);
console.log("第一:"+r);
this.boxratio(s,r);
//自执行函数闭包
(function(r){
window.addEventListener("resize",function(){
console.log("节点二:"+r);
_this.boxratio(_this.setdomobj[i],r);
})
})(r);
}
}
利用闭包,成功获取每个r的值,原理就是通过自执行函数,并且将变量r保存到这个自执行函数的参数中。