初学javascript闭包问题,写了段颜色渐变的demo,但是不好使,寻指导
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> window.onload = function () { var changeColor = function (node) { var i; for (i = 0; i < 16; i += 1) { var bgc = "#ff" + i.toString(16); (function (node,bgc) { setTimeout(function (){ node.style.backgroundColor = bgc; },100); })(node,bgc); } setTimeout(function () {changeColor(node)},200); }; changeColor(document.body); } </script> </head> <body> </body> </html>
firebug提示node.style.backgroundColor = bgc;中bgc未定义,可是我明明定义了呀
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
代码本身我目测应该没问题的,不知道你哪个版本的firebug。
你所说的渐变无效应该是另一个原因造成的。按照你的代码逻辑,for会在一瞬间循环完16次,然后延时100毫秒后,在一个瞬间切换16次颜色——我不觉得肉眼能够看得到这种所谓的瞬间渐变……(你可以试试把16次循环减少点就很明显了,你总是只能看到最后一次切换出的颜色)
你碰到的问题是,setTimeout延时是一种异步的操作,不会阻塞主体代码(你这里就是for循环)的执行,于是你主题代码中的for一瞬间就执行完了,生成的16个延时操作也跟着聚集在一起执行了。
你应该换一个思路,把下一次切换的内容放到setTimeout里去,而不要像你现在这样,在setTimeout的外部用for去实现。
我猜测下你的想法大概写了个,你参考下,应该就是你要的效果。
PS,回头看了下突然发现其实你不是要研究渐变而是要研究闭包。好吧,那我也坑爹地学着你原来的代码样子闭一个……