setTimeout和setInterval的浏览器兼容性分析

 更新时间:2007年02月27日 00:00:00   作者:  
无意中测试AJAXRequest浏览器兼容性的时候,发现AJAXRequest.update方法在某些情况下在IE里有问题,经过测试找到是setTimeout和setInterval的问题。
问题出现在当调用AJAXRequest.update方法时,如果带了更新间隔及更新次数,那么在IE下面就会出现问题,具体表现为带了更新间隔时是函数工作,带上更新次数时函数无法在更新指定次数后停止执行。
测试几个例子之后找到了问题所在,在IE里,setTimeout和setInterval是不支持参数传递的。
演示地址:http://www.xujiwei.cn/demo/usetimer/
在Netscape的JavaScript参考中找到setTimeout的语法如下:
复制代码 代码如下:

setTimeout
Evaluates an expression or calls a function once after a specified number of milliseconds elapses.
语法
setTimeout(expression, msec)
setTimeout(function, msec, arg1, ..., argN)
参数
expression  A string containing a JavaScript expression.
msec  A numeric value or numeric string, in millisecond units.  
function  Any function.  
arg1, ..., argN  (Optional) The arguments, if any, passed to function.  

第二种使用方法就是定义了一个定时器,在执行时function时,将把调用setTimeout时定义的参数传递给function,但在IE中,并不支持这种方式的调用,也就是在执行function的时候,函数并没有接收到这些参数。如下面的例子:
复制代码 代码如下:

<script type="text/javascript">
function show(str) {
    alert("my site: "+str);
}
setTimeout(show,100,"www.xujiwei.cn");
</script>

在Firefox和Opera里,浏览器都能正确的弹出提示框显示字符串“my site: www.xujiwei.cn”,而在IE里,显示的则是“my site: undefined”,说明函数show并没有接收到参数str,所以显示出来就是一个未定义变量。
当然,如果在函数内部使用的变量是全局变量时,就不必要考虑这些问题,如:
复制代码 代码如下:

<script type="text/javascript">
function show() {
    // url是全局变量,函数正确执行
    alert("my site: "+url);
}
var url="www.xujiwei.cn";
setTimeout(show,100);
</script>

这段代码在IE和Firefox里都能正常工作,显示出“my site: www.xujiwei.cn”。
在变量是全局变量的情况下,可以使用语句段的方式来调用setTimeout,即使用第一种语法:
复制代码 代码如下:

<script type="text/javascript">
function show(str) {
    // url是全局变量,函数正确执行
    alert("my site: "+str);
}
var url="www.xujiwei.cn";
setTimeout("show(url);",100);
</script>

因为变量url是全局变量,因此定时器执行所定义的语句段“show(url);”能正确传递参数,但是如果url不是全局变量,而是一个局部变量时,执行结果就会出错了:
复制代码 代码如下:

<script type="text/javascript">
function show(str) {
    // url是全局变量,函数正确执行
    alert("my site: "+str);
}
function test() {
    var url="www.xujiwei.cn";
    setTimeout("show(url);",100);
}
test();
</script>

此时就会出错了,在函数test执行时,会提示url未定义,在执行定义的语句段“show(url);”时,上下文已经脱离了函数test,而url是在函数test内部定义的,所以在执行函数test的时候,变量url已经释放了。
如果要在setTimeout里面使用局部变量,并且解决在IE里的setTimeout不支持参数传递的问题,可以使用匿名函数,即在调用setTimeout时定义一个匿名函数,在这个函数内部进行原来需要进行的操作。
复制代码 代码如下:

<script type="text/javascript">
function show(str) {
    // url是全局变量,函数正确执行
    alert("my site: "+str);
}
function test() {
    var url="www.xujiwei.cn";
    setTimeout(function(){show(url);},100);
}
test();
</script>

在上面的例子中,调用setTimeout时定义了一个匿名函数,它的函数体是“show(url);”,因为已经定义了函数,所以在定时器调用这个函数时,变量url还是有引用的,因些函数可以正确执行,显示出字符串“my site: www.xujiwei.cn”。
总的来说,使用setTimeout或者setInterval时需要注意以下几点:
1. 定义定时器时如果是使用的表达示,那么其中的变量应该是全局变量,或者是一个直接的值,而不能是局部变量。
2. 定义定时器时如果是定义的调用函数,那么应该只写函数名,而不能加括号,如果加了就是定义返回值了。
3. 在IE里使用定时器时不能传递参数。
4. 如果要在IE里使用定时器时传递参数,可以使用匿名函数,在函数体中调用原来该调用的函数。

如有错误还请指正。

相关文章

  • JavaScript中document对象使用详解

    JavaScript中document对象使用详解

    这篇文章主要介绍了JavaScript中document对象使用详解,总结的十分详尽,需要的朋友可以参考下
    2015-01-01
  • 简单谈谈Javascript函数中的arguments

    简单谈谈Javascript函数中的arguments

    在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。下面这篇文章主要介绍了关于Javascript函数中的arguments面貌以及如何转化为数组的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • javascript window.opener的用法分析

    javascript window.opener的用法分析

    window.opener 返回的是创建当前窗口的那个窗口的引用
    2010-04-04
  • 浅谈javascript错误处理

    浅谈javascript错误处理

    本文主要从前端开发者的角度谈一谈大多数前端开发者都会遇到的js错误,对错误产生的原因、发生阶段,以及如何应对错误进行分析、归纳和总结,希望得到一些有益的结论用来指导日常开发工作。
    2019-08-08
  • Javascript入门学习第二篇 js类型

    Javascript入门学习第二篇 js类型

    上篇文章讲了js中的一些概念(词法结构) 和 数据类型(部分)。 这章我们 继续.然后了解下js中操作数据 和 函数的 作用域。
    2008-07-07
  • Adapter适配器模式在JavaScript设计模式编程中的运用分析

    Adapter适配器模式在JavaScript设计模式编程中的运用分析

    适配器模式的作用是解决两个软件实体间的接口不兼容的问题,在JavaScript尤其是AJAX方面比较常用,接下来看一下对Adapter适配器模式在JavaScript设计模式编程中的运用分析
    2016-05-05
  • 深入理解Javascript中的观察者模式

    深入理解Javascript中的观察者模式

    观察者模式又称发布订阅模式,是一种最常用的设计模式之一了。下面这篇文章主要给大家深入的介绍了Javascript中观察者模式的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • javaScript获取对象中非空的属性实现方法详解

    javaScript获取对象中非空的属性实现方法详解

    这篇文章主要为大家介绍了javaScript获取对象中非空的属性实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • JavaScript 基础知识 被自己遗忘的

    JavaScript 基础知识 被自己遗忘的

    JavaScript 基础知识 被自己遗忘的,学习的朋友可以参考下。
    2009-10-10
  • 推荐10款扩展Web表单的JS插件

    推荐10款扩展Web表单的JS插件

    本篇文章给大家介绍了10款扩展Web表单的javascript的插件,一起跟着小编来学习下吧。
    2017-12-12

最新评论