超时后循环中的javascript变量范围/闭包
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了超时后循环中的javascript变量范围/闭包,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2336字,纯文字阅读大概需要4分钟。
内容图文
![超时后循环中的javascript变量范围/闭包](/upload/InfoBanner/zyjiaocheng/703/c28821dcbb724481bbccd8f0ff08e102.jpg)
现在已经很晚了,道格拉斯·克罗克福德生活的大脑部分已经关闭了.我尝试了一些事情,但没有按预期做的事情.
我有一个画布,我绘制了2行,然后在计时器上淡出它们,但只有循环中的最后一行被淡出.这是我的小提琴,在JS中向下看50行,看看它在行动中在右下方的窗格中拖动鼠标:
这是函数,基本上超时只得到循环中的最后一个值,我以前见过这个,我敢肯定,如果我不是那么神志不清,它可能会更简单.这是特别的功能:
function update()
{
var i;
this.context.lineWidth = BRUSH_SIZE;
this.context.strokeStyle = "rgba(" + COLOR[0] + ", " + COLOR[1] + ", " + COLOR[2] + ", " + BRUSH_PRESSURE + ")";
for (i = 0; i < scope.painters.length; i++)
{
scope.context.beginPath();
var dx = scope.painters[i].dx;
var dy = scope.painters[i].dy;
scope.context.moveTo(dx, dy);
var dx1 = scope.painters[i].ax = (scope.painters[i].ax + (scope.painters[i].dx - scope.mouseX) * scope.painters[i].div) * scope.painters[i].ease;
scope.painters[i].dx -= dx1;
var dx2 = scope.painters[i].dx;
var dy1 = scope.painters[i].ay = (scope.painters[i].ay + (scope.painters[i].dy - scope.mouseY) * scope.painters[i].div) * scope.painters[i].ease;
scope.painters[i].dy -= dy1;
var dy2 = scope.painters[i].dy;
scope.context.lineTo(dx2, dy2);
scope.context.stroke();
for(j=FADESTEPS;j>0;j--)
{
setTimeout(function()
{
var x=dx,y=dy,x2=dx2,y2=dy2;
scope.context.beginPath();
scope.context.lineWidth=BRUSH_SIZE+1;
scope.context.moveTo(x, y);
scope.context.strokeStyle = "rgba(" + 255 + ", " + 255 + ", " + 255 + ", " + .3 + ")";
scope.context.lineTo(x2, y2);
scope.context.stroke();
scope.context.lineWidth=BRUSH_SIZE;
},
DURATION/j);
}
}
}
解决方法:
问题是你在传递给setTimeout()的函数中引用的变量dx,dy等是在周围的作用域中定义的,并且当任何超时实际运行时,这些变量都保存了最后一次迭代的值.循环的.
您需要创建一个额外的包含函数来关闭每次迭代的值.尝试以下内容:
for(j=FADESTEPS;j>0;j--) {
(function(x,y,x2,y2) {
setTimeout(function() {
scope.context.beginPath();
scope.context.lineWidth=BRUSH_SIZE+1;
scope.context.moveTo(x, y);
scope.context.strokeStyle = "rgba(" + 255 + ", " + 255 + ", " + 255 + ", " + .3 + ")";
scope.context.lineTo(x2, y2);
scope.context.stroke();
scope.context.lineWidth=BRUSH_SIZE;
},
DURATION/j);
})(dx, dy, dx2, dy2);
}
这为j = FADESTEPS循环的每次迭代创建了一个新的匿名函数,立即执行它并传递dx等值,就像循环的每次迭代运行时一样,并移动x,y等变量超出现有功能并使其成为新功能的参数,然后在超时运行时它将使用正确的值.
内容总结
以上是互联网集市为您收集整理的超时后循环中的javascript变量范围/闭包全部内容,希望文章能够帮你解决超时后循环中的javascript变量范围/闭包所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。