`
偶然——相逢
  • 浏览: 904 次
  • 性别: Icon_minigender_2
  • 来自: 安徽
文章分类
社区版块
存档分类
最新评论

setTimeout\setInterval

阅读更多
setTimeout与setInterval是window对象的两个非常神奇方法,用于实现定时或延时调用一个函数或一段代码。
(新手可能认为setTimeout与setInterval是javascript函数,这是错误的。新手容易将javascript对象函数与DOM对象方法混淆。)

先来一段代码,大家猜猜在各种浏览器下的结果会是怎么样的呢?
JScript codefunction f(){
    var s = 'arguments.length:'+arguments.length+'; ';
    for(var i=0,n=arguments.length;i< n;i++){
        s += ' ['+i+']:'+arguments[i]+'; ';
    }
    alert(s);
}
setTimeout(f,500,"javascript","AAA")


我这里要探讨的,不是什么时候该用哪一个,而是探讨这两个方法在各浏览器中的差异。

原先我一直没觉得这两个方法会有什么乌龙,一个偶然的机会让我得知了,现在整理一下写出来和大家分享。

因为setTimeout与setInterval的参数和用法是一样的,只是功能不同,所以,为了省事,我下面只以setTimeout为例进行说明以及举例。

setTimeout被最经常用到的形式大概是如下2种样子的:
JScript code
    iTimerID = setTimeout(strJsCode, 50)   //strJsCode为一个包含 js代码的字符串
    iTimerID = setTimeout(objFunction, 50) //objFunction为一个函数对象


第一种调用方式是传包含js代码的字符串,这种方式的好处是简洁,但坏处是运行效率差,而且不利于语法解析,有潜在风险,更重要的是,处理比较复杂的内容比较费劲,这一点和eval的弊端是一致的。
所以,我们认为,通常应当采用第二种方式调用为好。(后面我的例子均采用第2种调用方式)


现在来揭晓开头那一段代码在各种浏览器下的结果:
IE(6,7,8)是: arguments.length:0;
Opera(6,7,8)是: arguments.length:2; [0]:javascript; [1]:AAA;
Firefox(3.0)是: arguments.length:3; [0]:javascript; [1]:AAA; [2]:-15;
竟然有这么大的差别,还真是“你唱你的曲,我哼我的调”!
Firefox(3.0)下,得出的最后一个数字是不特定的,有时候是0,有时候是一个负数,这问题后面再说。


(一)IE系列中的setTimeout

首先,我们看看微软出的DHTML参考手册中是如何说的:

setTimeout Method
  Evaluates an expression after a specified number of milliseconds has elapsed.

Syntax
  iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage])

Parameters
  vCode Required. Variant that specifies the function pointer or string that indicates
  the code to be executed when the specified interval has elapsed.
  iMilliSeconds Required. Integer that specifies the number of milliseconds.
  sLanguage Optional. String that specifies one of the following values:
  JScript Language is JScript.
  VBScript Language is VBScript.
  JavaScript Language is JavaScript.

MSDN上关于setTimeout的说明:
  http://msdn.microsoft.com/en-us/library/ms536753(VS.85).aspx

也就是说,setTimeout接收3个参数,第3个参数表示脚本语言的类型,如果你再传入更多的参数,是无意义的。
因此,在IE中,以下两种都是对的。
JScript code        setTimeout('alert(1)', 50);

        setTimeout('msgbox "终止、重试、忽略,您看着办吧。", vbAbortRetryIgnore + vbDefaultButton2, "告诉您"', 50, 'VBScript');



(二)Mozilla系列中的setTimeout

我们看看Mozilla官方网站上 Gecko DOM Reference 手册中是如何说的:
window.setTimeout
  Summary
  Executes a code snippet or a function after specified delay.

  Syntax
  var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
  var timeoutID = window.setTimeout(code, delay);

前两个参数都一样,没差别,从第三个参数就不同了。
因为目前只有IE浏览器支持多种语言的脚本,其它浏览器只支持js脚本所以不需要传语言类型的参数。
Mozilla把传给setTimeout的第3个以及更后面的更多参数依次的传给前面的func做为参数。
Firefox, Opera, Safari, Chrome等等也都是如此。

但是注意到,Mozilla上说了他家的setTimeout有一个叫做"Lateness" argument的BUG.
  "Lateness" argument
  Functions invoked by setTimeout are passed an extra "lateness" argument in Mozilla,
  i.e., the lateness of the timeout in milliseconds. (See bug 10637 and bug 394769.)
这就是开头那个例子中,Firefox(3.0)下有一个乌龙数字的根源。

Mozilla上关于setTimeout的说明:
  https://developer.mozilla.org/en/DOM/window.setTimeout

(三)其它浏览器系列(Opera, Safari, Chrome)中的setTimeout
  和Mozilla系列中的基本一样,但是没有Mozilla系列中的多一个参数的BUG.


武林外传:使用setTimeout的小技巧

  (1)IE中给setTimeout中的调用函数传参数
  上面的分析可知,IE是不支持在setTimeout中给被调用的函数传参数的,为了浏览器世界的和谐,我们可以把函数调用参数包裹进新的匿名函数中。示例:
  function f(a){
  alert(a);
  }
  // setTimeout(f,50,'hello'); //用于非IE
  setTimeout(function(){f('hello')},50); //通用
  var str='hello';
  setTimeout(function(){f(str)},50); //通用

  (2)this问题
  setTimeout调用的函数被执行时的上下文是全局,而不再是调用setTimeout方法时的上下文。所以,setTimeout的第一个参数的函数被执行时其this是指向window的,如果需要保留调用setTimeout方法时的this,就需要把当时的this传进去。示例:
  function Person(name){
  this.name=name;
  var f=function(){alert('My name is '+this.name)};

  // setTimeout(f,50); //错误

  var THIS=this;
  setTimeout(function(){f.apply(THIS)},50); //正确,通用
  setTimeout(function(){f.call(THIS)},50); //正确,通用
  }
  new Person('Jack');

要说的就这些了。
发帖子不是脑力活,其实是体力活,组织文字,写例子,排版,这些没技术含量的事情是最累人最耗时间的。

-----
这是我的一篇老文章了,写在博客里的,觉得可以拿到这里来和大家分享一下。
如果排版乱,可以到我的博客里看,那里的格式好控制些。
这里的发帖内容不仅不能预览,还不能修改。
分享到:
评论
1 楼 高级java工程师 2011-09-20  
我的ssh刚刚更新完毕,如果有事情,请联系QQ503229799

相关推荐

    关于JS定时器(setTimeout setInterval)定时不准问题1

    关于JS定时器(setTimeout setInterval)定时不准问题1 在JavaScript中,setTimeout和setInterval是两个基本的定时器函数,用于实现延迟执行或循环执行某个函数。然而,这两个函数在执行时往往和我们设置的延迟时间...

    Javascript定时器(二)——setTimeout与setInterval

    在这个主题中,我们将深入探讨`setTimeout`和`setInterval`这两个核心定时器函数,它们在JavaScript中的应用以及它们之间的区别。 首先,`setTimeout`函数用于在指定的毫秒数后调用一个函数或执行一段代码。它的...

    Javascript中, setTimeout() 和 setInterval() 的方法

    在JavaScript编程中,`setTimeout()`和`setInterval()`是两个非常关键的函数,它们用于实现异步编程,特别是在处理动画、定时任务或者延迟执行代码时不可或缺。这两个函数都是全局对象`window`的方法,它们的区别...

    理解javascript定时器中的setTimeout与setInterval

    本文将深入讲解JavaScript中的两个重要定时器函数:`setTimeout`和`setInterval`。 首先,`setTimeout`函数用于在指定延迟时间后执行一次函数或代码片段。其基本语法如下: ```javascript var timeoutID = window....

    计时器解决setIntervalsetTimeout的休眠问题

    real-interval 如果你用setTimeout或setInterval实现过网页倒计时功能,你就会发现: 当电脑或者APP休眠了一段时间后,倒计时会出现问题:它比正确的时间慢了。 real-interval能解决这个问题。

    javascript之setTimeOut和setInterval的用法

    使用SetInterval和设定延时函数setTimeout 很类似。setTimeout 运用在延迟一段时间,再进行某项操作。

    setTimeout和setInterval的区别

    在JavaScript中,定时执行任务是通过`setTimeout`和`setInterval`这两个函数来实现的。它们都是用于在指定延迟后执行代码,但它们之间存在显著的区别。 `setTimeout`函数用于在给定的`DelayTime`(延迟时间)过后...

    JS中的setTimeout和setInterval的区别JS中的setTimeout和setInterval的区别

    ### JS中的setTimeout与setInterval的区别 在JavaScript编程中,`setTimeout`与`setInterval`是两个非常常用的函数,用于控制代码执行的时间间隔。虽然它们在功能上有一定的相似性,但其实现的效果却大不相同。下面...

    给c#添加SetTimeout和SetInterval函数.docx

    ### 给C#添加SetTimeout和SetInterval函数 在日常的软件开发过程中,我们经常会遇到需要定时执行某些任务的情况。JavaScript 提供了 `setTimeout` 和 `setInterval` 这两个非常方便的函数来处理这样的需求。然而,...

    fontonload:跨浏览器检测Web字体加载,而无需通过计时器进行检查(setTimeout setInterval)

    跨浏览器检测Web字体加载,而无需通过计时器(setTimeout / setInterval)进行检查。 用法 使用patch.ttf文件修补字体,该文件包括上的空白图形(无间距和无标记) 在CSS中声明@font-face 。 加载库。 ...

    Javascript中setTimeOut和setInterval的定时器用法

    Javascript的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请求获取最新数据等等。但它们的应用是有区别的。 ...

    setInterval setTimeout.html

    setInterval setTimeout.html

    VUE中setTimeout和setInterval自动销毁案例

    在Vue.js应用中,我们经常会遇到使用`setTimeout`和`setInterval`来实现某些延时或周期性操作。然而,如果不正确地管理这些定时器,它们可能会在组件被销毁后仍然继续运行,导致不必要的资源消耗和潜在的问题。本文...

    javascript setTimeout和setInterval计时的区别详解

    JavaScript中的定时器函数setTimeout和setInterval都用于延迟执行代码,但它们的工作方式和用法有所不同。以下是关于这两个函数的详细解析: 1. setTimeout函数的基本概念和用法: setTimeout是JavaScript中的一个...

    vue 解决setTimeOut和setInterval函数无效报错的问题

    在Vue.js开发过程中,有时会遇到`setTimeout`和`setInterval`函数失效并抛出错误的问题。本文将详细解析这个问题的原因及解决方案。 首先,`setTimeout`和`setInterval`是JavaScript中的两个常用定时器函数。`...

    js代码-settimeout 模拟实现 setinterval(带清除定时器的版本)

    在JavaScript中,`setTimeout`和`setInterval`是两个非常重要的定时器函数,它们用于在指定的时间后执行特定的函数。然而,`setInterval`在某些情况下可能不如我们期望的那样工作,因为它会周期性地不间断执行,即使...

    JavaScript中setTimeout和setInterval函数的传参及调用_.docx

    JavaScript 中 setTimeout 和 setInterval 函数的传参及调用 在 JavaScript 中,setTimeout 和 setInterval 函数都是用于在指定的时间点执行某个函数的,但是它们的传参方式和调用方式却有所不同。 setTimeout ...

    JavaScript中SetInterval与setTimeout的用法详解

    setTimeout 描述 setTimeout(code,millisec) setTimeout() 方法用于在指定的毫秒数后调用函数或计算...setInterval(code,millisec[,”lang”]) 参数 描述 code 必需,要调用的函数或要执行的代码串。 mi

    javascript setTimeout和setInterval 的区别

    JavaScript中的`setTimeout`和`setInterval`是两个重要的定时器函数,它们都属于全局`window`对象的方法,常用于在指定的时间后执行某段代码或周期性地重复执行某段代码。然而,它们的工作机制和用途有所不同。 1. ...

    JavaScript setTimeout和setInterval的使用方法 说明

    在JavaScript编程中,setTimeout和setInterval是用于控制代码在一定时间后执行或定期重复执行的两个非常有用的函数。这两个函数都是JavaScript的全局函数,可以在浏览器环境中直接使用,也可以在Node.js中使用。 ##...

Global site tag (gtag.js) - Google Analytics