开发者社区> 问答> 正文

setTimeout “不执行”和异步

前两天一直在做一个效果,想法很简单,就是希望能够在网页加载后导航项能够动态弹出,以下是代码:

window.onload=init;
 
function init(){
var alink =null;
alink = document.getElementById("nav").getElementsByTagName("A");
for(var i=0;i<alink.length;++i)
{
        var mar = 35;
    var time1=null;
    while(mar > 0)
    {
        time1=window.setTimeout("",15); //希望在此延迟15ms,但此处不执行,直接跳过
        mar=mar-5;
        alink[i].style.marginTop=""+mar+"px";
    }
    }
}

然而非常遗憾,执行至time1=window.setTimeout("",15);并没有产生预想中的延迟,而被直接跳过。我做了很多次尝试,不断的修改,纠结了几天还是不行,于是我就向网上求助。根据网上的意见,说是所执行语句不能为空,需要给他一个事件,ok,那我们就给他一个事件(其实我先前也这么尝试过)。将function(){mar=mar-5;}插入分号中。再度执行,产生了死循环,浏览器崩溃。跟踪之后mar值一直不变,也就是说函数没有执行。于是我也崩溃了。

网上回复给了我个例子,给了我看了一下,能跑。可是他的效果跟我想要的还是有一些出入,他大概就用了一种类似递归掉用的方法来去掉了循环语句。我不知道为什么这样做能行,还是试着照此方法改了。可是当我根据他的例子进行修改之后,同样的问题出现了,setTimeout的语句部分还是没能执行。我继续纠结。

自习的时候拿书翻了一下(先前没想到要到书上去找),然后很意外的让我看到了答案,然后我就眼泪盈眶,为什么不去先翻书??

书上说了,setTimeout()方法的第一个参数是一个闭包,它指定了要运行的函数。它的第二个参数是一个数值,表示的是以毫秒计算的运行延时。注意传递给setTimeout()的第一个参数也可以是表示执行代码的字符串,如果是字符串,那么setTimeout()方法会调用Function对象将这个字符串构造成函数执行。

setTimeout及setinterval都是异步执行的函数,就是它会在触发事件发生(延迟时间)之后去执行调用事件,这个过程并不会中断顺序执行的过程,而不是象c语言中的delay一样,延迟的是顺序执行的过程。而该过程大概是开启了另外的一个线程,而的具体的我也还不懂。

展开
收起
a123456678 2016-07-15 09:54:59 2932 0
2 条回答
写回答
取消 提交回答
  • time1=window.setTimeout("",15); //希望在此延迟15ms,但此处不执行,直接跳过

    这里只是一个赋值操作,而且setTimeout不等于sleep。

    setTimeout(function() {
    }, 15000);
    这里面的function才会在15s后执行。

    2019-07-17 19:56:43
    赞同 展开评论 打赏
  • window.onload=init(mar,i);
    function init(mar,i)
    {
            if(mar>0) 
            {
                alink[i].style.marginTop=mar+"px";
                mar-=5;
                setTimeout("init("+mar+","+i+")",50);
            }
            else{
                i++;
                mar=35;
                if(i+1>alink.length){
                    return 0;
                }
                 
                 
                setTimeout("init("+mar+","+i+")",50);
            }
         
    }

    事后我也有了一点点感想,我以为我知道dom结构,熟悉css,理解程序控制就基本能使用js了,不必再去细看什么的,真正动起手来才发现问题多多,一个不到50行的小程序就把我纠结了几天。发现问题没有从最根本的理解上去寻找根源,而是盲目的尝试,而忽视了基础。我发贴的时候说我是新手,那是我为我是有点小谦虚。绕了几个弯之后我才发现,原来我,真是个新手.

    2019-07-17 19:56:43
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载