超时调用与间歇调用

1.首先要清楚,JavaScript是单线程语言,一段时间内只能执行一段代码。因此就有一个JavaScript的任务队列来控制代码的执行顺序。window对象的属性setTimeout()的第二个参数就是告诉JavaScript再过多长时间将当前任务添加到队列中。如果队列是空的,那么添加的代码会立即执行;如果队列不是空的,那么先等到前面的代码执行完后再执行。间歇调用setInterval()与超时调用相似,只不过是重复调用。

 setTimeout(function(){
      alert("Hello");
  },1000);

//setTimeout()与setInterval()的第一个参数可以是函数,也可以使字符串,但是不建议使用字符串,因为代码包裹在字符串中需要二次解析会导致性能问题。还会引起作用域问题

var name="liu";
   function sayName(){
      var name="liuliu";

setTimeout("alert(name)",1000); //字符串形式 liu

   }
   sayName();

//////////////////////////////////////////////////

var name="liu";
   function sayName(){
      var name="liuliu";

setTimeout(function(){
          alert(name);
      },1000); //函数形式 liuliu
   }
   sayName();

 

2.超时调用和间歇调用都返回一个标识符,可以用于取消调用,clearTimeout()与clearInterval()。一般只有间歇调用需要取消调用操作,不然会重复下去。在实际中一般使用超时调用模拟间歇调用,因为间歇调用可能在前一个间歇调用结束之前调用。

 //间歇调用  var num=0,
       max=5,
       intervalId=null;
   function incrementNumber(){
       num++;
       if(num==max){
           clearInterval(intervalId);  //当num=max时取消间歇调用
           alert(num);
       }
   }

   setInterval(incrementNumber,1000);  //间歇调用

//用超时调用模拟间歇调用
    var num=0,
    max=5;
    function incrementNumber(){
       num++;
       if(num<max){
          setTimeout(arguments.callee,1000); //回调函数,且解除函数与函数名的耦合关系
       }else{
          alert(num);
       }
    }
   setTimeout(incrementNumber,1000); //超时调用

 

3.超时调用的代码都是在全局作用域中执行的,因此函数的this值在非严格模式下指向window对象,在严格模式下是undefined。

var name="liu";
   var o={
       name:"liuliu",
       sayName:function(){
           alert(this.name);   //liuliu
       }
   };
   o.sayName();

//超时调用的this值
 var name="liu";
   var o={
       name:"liuliu",
       sayName:function(){
           setTimeout(function(){   //超时调用
               alert(this.name);    //liu
           },1000);
       }
   };
   o.sayName();

4.调用的两种方式:

      function sayName(){
          alert("liu");
       }
       function test(){
           function sayName(){
              alert("liuliu");
           }

           setTimeout(sayName,1000);   //liuliu
           setTimeout("sayName()",1000);  //liu
      }
      test();

////////////////////////////////////////////////////
     function sayName(){
          alert("liu");
       }
       function test(){
         /*   function sayName(){
              alert("liuliu");
           }*/ 

           setTimeout(sayName,1000);   //liu
           setTimeout("sayName()",1000);  //liu
      }
      test();
////////////////////////////////////////////////////
       /*  function sayName(){
          alert("liu");
       }*/
       function test(){
           function sayName(){
              alert("liuliu");
           }

           setTimeout(sayName,1000);   //liu
           setTimeout("sayName()",1000);  //显示sayName未定义
      }
      test();
////////////////////////////////////////////////////
   (function(){    //添加了个块级作用域
       function sayName(){
          alert("liu");
       }
       function test(){
           function sayName(){
              alert("liuliu");
           }

           setTimeout(sayName,1000);   //liuliu
           setTimeout("sayName()",1000);  //显示sayName未定义
      }
      test();
   })();

setTimeout("sayName()",1000)这种形式,只能调用全局作用域中的函数,我不建议使用这种方式。setTimeout(sayName,1000)遵守一般的作用域访问规则。
时间: 2024-08-29 09:14:31

超时调用与间歇调用的相关文章

JavaScript超时调用、间歇调用

超时调用 //onclick设置按钮点击之后要执行的代码地址,fnFun就是要执行的代码函数 <input type="button" value="暂停" onclick="fnFun()"> <script> var fnFun2 = function (){ console.log('fnFun2'); } //参数一:超时后会被调用的函数地址 //参数二:等待时间 //返回值:定时器的ID,可以通过这个ID来终止这

JS中的间歇调用setInterval()与超时调用setTimeout()相关总结

超时调用需要使用window.setTimeout(code,millisec)方法 它接受两个参数:要执行的代码和以毫秒表示的时间(即在执行代码前需要等待多少毫秒).其中第一个参数可以是一个包含JS代码的字符串(就和在eval()函数中使用的字符串一样),也可以是一个函数.第二个参数表示等待多长时间的毫秒数,但经过该事件后指定的代码不一定会执行. 这是因为JS是一个单线程序的解释器,一定时间内只能执行一段代码,为了控制要执行的代码就有一个JS任务队列,这些任务会按照将他们添加到队列的顺序执行.

超时调用setTimeout 和 间歇调用setInterval

今天看了javascript高级程序设计(第三版)一书,发现说setTimeout比setInterval更好,觉得的确如此.平时都是用setInterval多点,现在还是转一下思路了.又学习到了.笔记如下: ------------------------------------------------------------------------------------------------------------------------------------------- setTi

定时器 setTimeout()超时调用和 setInterval()间歇调用

JavaScript是单线程语言,但它允许通过设置定时器,也就是设置超时值和间歇时间来调度代码在特定的时刻执行.前者是在指定的时间过后执行代码,而后者则是每隔指定的时间就执行一次代码. 超时调用需要使用window对象的setTimeout()方法,他接受两个参数:要执行的代码和以毫秒表示的时间.其中,第一个参数可以是一个包含JavaScript代码的字符串,也可以是一个函数.例如,下面对stTimeout()的两次调用都会在一秒钟后显示一个警告框: //不建议传递字符串! setTimeout

RHEL6-X Window System-8.图形桌面的本地调用与远程调用解析

Linux的X或X11 (X Window System)是一个基础的图形框架接口,拥有基本的图形显示.在此框架基础之上,有诸如GNOME/KDE之类的图形桌面窗口管理应用软件(Window manager).而且图形框架X11包括两大部分X Client与X Server,采用C/S主从架构.所以它是一个system而不单单只是一个组件. Linux图形桌面的本地调用与远程调用解析如图 说明: 通过图形还是文本控制台传递命令,经过内核处理后,返回相应的数据给对方 本地情况: 1.如果是图形,则

同步调用和异步调用同时存在导致的混乱

其实在Promise之外也存在这个问题,这里我们以一般的使用情况来考虑此问题.这个问题的本质是接收回调函数的函数,会根据具体的执行情况,可以选择是以同步还是异步的方式对回调函数进行调用.下面我们以 onReady(fn) 为例进行说明,这个函数会接收一个回调函数进行处理. mixed-onready.js function onReady(fn) { var readyState = document.readyState; if (readyState == 'interactive' ||

java三种调用方式(同步调用/回调/异步调用)

1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口 ) 实例2:老师平时学生布置任务后不可能一直等待和监督学生完成,老师通常会告诉学生,任务完成后给他打个电话或者发个信息,那么学生给老师返回结果的过程需要老师信息,这就是一个回调的过程.

构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序

构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 对象是由“底层向上”开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止.因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明0,就调用直接基类的默认构造函数.在对象析构时,其顺序正好相反.   下面简单介绍下这三个函数. 构造函数       1.构造函数不能有返回值  

直接调用、间接调用和内联调用

一般情况下,当C或者C++编译器遇到一个非内联函数的定义时,它会为该函数的定义生成机器码,并把这些机器码存储在一个目标文件中.同时,它还创建了一个与这些机器码相关联的名称.在C中,这个名称通常就是函数本身的名称:而在C++中,该名称还要加上参数类型的编码,从而即使在出现函数重载的情况下,也能够获得唯一的名称(最后这个名称通常称为mangled name,有时也称为decorated name).譬如,当编译器看到一个如下的调用: f() 它将会生成函数f的机器码.对于大多数机器语言来说,调用指令