贝网博客

我的分类
流水记事
源码下载
Asp.net
其它
数据库
Javascript
.Net技术
我的相册
友情链接
博客园
CSDN博客
Start0
最新回复
嗷嗷的cCC
fasdfasdf
[:..
lz这个东西好厉害,我..
哈哈,好照片
不错,以前一直用黄色..
终于找到支持ff的修正..
终于找到支持ff的修正..
新鲜性
看看,试试,好不好使。
分类 =》Javascript
Javascript在循环中使用匿名函数,变量值被修改的问题与解决
发表于:2011-01-29 16:52:22
更新于:2011-11-18 10:25:34

今天在开发中,遇到一点小问题,如下面的代码,目的是每秒弹出一个警告,第一次弹出1,第二次弹出2……:
function test() {
    for (var i = 0; i < 3; i++) {
        var a = i;
        setTimeout(function() {  alert(a); }, 100);
    }
}
运行结果,是弹出了3个2,跟我想象的完全不同,究其原因,是因为f这个匿名函数在整个循环结束后,再运行的,而循环结束时a的值已经递增到2了,在循环结束后这个a变量没有销毁,造成了这个结果,解决方法,就是把for循环里加一个匿名函数闭包,使a在当前循环结束时销毁即可:
写法1:
function test() {
    for (var i = 0; i < 3; i++) {
        (function() {
            var a = i;
            setTimeout(function() {  alert(a); }, 100);
        })();
    }
}
写法2:
function test() {
    for (var i = 0; i < 3; i++) {
        (function(a){setTimeout(function(){alert(a)}, 100);})(i);
    }
}
上面这两段代码成功输出了:0,1,2

btw1:上面出错的原因是在修改 在页面加载完成后,再显示广告 的问题时出现的,在onload里通过循环去加载广告内容,并显示在div里:
var divs = ["#a1", "#a2"];
var urls = ["t.aspx?flg=81959", "t.aspx?flg=aa"];

function adLoad() {
    for (var i = 0; i < divs.length; i++) {
        (function() {
            var url = urls[i];
            var div = divs[i];

            jQuery.get(url, null, function(data) {
                jQuery(div).html(data);
            });
        })();
    }
}

btw2:立即执行匿名函数的方法有下面3种:
(function(){alert(1);})();
(function(){alert(2);}());
void function(){alert(3);}();

评论列表(1条)
by: qq
2011-09-05 19:27:13
发表评论
名称(*):
邮箱:
正文:

©2008 Beinet.cn 版权所有