+ -
当前位置:首页 → 问答吧 → js问题 头疼啊

js问题 头疼啊

时间:2011-12-09

来源:互联网

JScript code
var s=0;
for(var i=0;nn!=null&&i<nn.length;i++){//长度为10
alert(i+"test");
setInt=setTimeout((function(node){return function(){
if(s==i){
alert(s+"s"+i+"i");//这里的s和i为什么弹出10次10啊,怎么不是从0开始到10
var node=new Node();
node=mixIn(nn[i],node);
node.type=typeToNum(node.type);
node.position=new Position(node.position.top,node.position.left);
nodes[node.index]=node;
createNode(node);
}else{
clearTimeout(setInt);
}
}})(node),3000);
s=s+1;
}


谁会指点一下

作者: yj1300918200   发布时间: 2011-12-09

第一次循环s = 0;先执行alert('0test');后执行setInt,但由于这个方法是3秒钟再执行(相当于多线程吧),所以s+=1先执行,此时s=1,
接着第二次循环,以此类推,当循环完10次后,s=10,i=10,还没有经过3秒,故等到三秒中后alert(‘10s10i’)才第一次打印,接着很快就打印其余9次了。

作者: EEXXTTJJSS   发布时间: 2011-12-09

真心看不懂你这段代码是想干什么。。作为形参的node,居然是在函数内部才定义。。这是典型的闭包问题,给你个简单的例子HTML code
            var s = 0, setInt;
            for (var i = 0; i < 10; i++) {
                (function(){
                    var index = i;
                    setInt = setTimeout(function(){
                        if (s === index) {
                            alert("success! i: " + index);
                        }
                        else {
                            alert("error! i: " + index);
                            clearTimeout(setInt);
                        }
                    }, 3000);
                })();
            }

作者: axiheyhey   发布时间: 2011-12-09

这是根据你的代码改的JScript code
            var s = 0, setInt;
            for (var i = 0; i < 10; i++) {//长度为10
                setInt = setTimeout((function(){
                    var _i = i;
                    return function(){
                        if (s == _i) {
                            alert("s: " + s + ", i: " + _i);//这里的s和i为什么弹出10次10啊,怎么不是从0开始到10
                            s++;
                        }
                        else {
                            clearTimeout(setInt);
                        }
                    }
                })(), 3000);
            }

作者: axiheyhey   发布时间: 2011-12-09

引用 1 楼 eexxttjjss 的回复:
第一次循环s = 0;先执行alert('0test');后执行setInt,但由于这个方法是3秒钟再执行(相当于多线程吧),所以s+=1先执行,此时s=1,
接着第二次循环,以此类推,当循环完10次后,s=10,i=10,还没有经过3秒,故等到三秒中后alert(‘10s10i’)才第一次打印,接着很快就打印其余9次了。

我是想让它停3秒再执行 s=s+1 和下次循环的

作者: yj1300918200   发布时间: 2011-12-09

类似
var a = 10;
var b = 0;

function test(){
  b++;
  if(b < a){
  setTimeout("test()",5000);
  }
  alert(b);
   
}

test();

作者: EEXXTTJJSS   发布时间: 2011-12-09