cari
Rumahhujung hadapan webtutorial jssetTimeout与setInterval在不同浏览器下的差异_javascript技巧

。(新手可能认为setTimeout与setInterval是javascript函数,这是错误的。新手容易将javascript对象函数与DOM对象方法混淆。)

先来一段代码,大家猜猜在各种浏览器下的结果会是怎么样的呢?

复制代码 代码如下:

function f(){
var s = 'arguments.length:'+arguments.length+'; ';
for(var i=0,n=arguments.length;is += ' ['+i+']:'+arguments[i]+'; ';
}
alert(s);
}
setTimeout(f,500,"javascript","AAA")

我这里要探讨的,不是什么时候该用哪一个,而是探讨这两个方法在各浏览器中的差异。
原先我一直没觉得这两个方法会有什么乌龙,一个偶然的机会让我得知了,现在整理一下写出来和大家分享。
因为setTimeout与setInterval的参数和用法是一样的,只是功能不同,所以,为了省事,我下面只以setTimeout为例进行说明以及举例。
setTimeout被最经常用到的形式大概是如下2种样子的:
复制代码 代码如下:

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中,以下两种都是对的。
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');

要说的就这些了。
发帖子不是脑力活,其实是体力活,组织文字,写例子,排版,这些没技术含量的事情是最累人最耗时间的。
Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
settimeout和setinterval有什么区别settimeout和setinterval有什么区别Aug 15, 2023 pm 02:06 PM

settimeout和setInterval的区别:1、触发时间,settimeout是一次性的,它在设定延迟时间之后执行一次函数,而setinterval是重复性的,它会以设定的时间间隔重复执行函数;2、执行次数,settimeout只执行一次,而setinterval会一直重复执行,直到被取消。

如何使用setInterval函数定时执行代码?如何使用setInterval函数定时执行代码?Nov 18, 2023 pm 05:00 PM

如何使用setInterval函数定时执行代码?在JavaScript中,setInterval函数是一个非常有用的函数,它可以定时执行一段代码。通过setInterval函数,我们可以在特定的时间间隔内重复执行指定的代码。本文将详细介绍如何使用setInterval函数,并提供具体的代码示例。一、setInterval函数的基本语法如下:setInterv

Window.setInterval()方法怎么使用Window.setInterval()方法怎么使用Aug 31, 2023 am 09:33 AM

Window.setInterval() 方法的基本语法是“window.setInterval(function, delay)”,function是要重复执行的函数或代码块,delay是每次执行之间的时间间隔,以毫秒为单位。该方法是JavaScript中用于定时重复执行指定函数或代码的方法,它的使用非常简单,只需要传入要执行的函数或代码块以及重复执行的时间间隔。

setInterval如何停止setInterval如何停止Dec 11, 2023 am 11:39 AM

可以使用clearInterval函数来停止由setInterval函数创建的定时器。setInterval函数会返回一个唯一的定时器ID,可以将该ID作为参数传递给clearInterval函数,以停止定时器的执行。

setTimeout()和setInterval()在JavaScript中有什么区别?setTimeout()和setInterval()在JavaScript中有什么区别?Sep 01, 2023 pm 03:01 PM

setTimeout(function,duration)-该函数在duration毫秒后调用函数。这适用于一次执行。让我们看一个例子-它等待2000毫秒,然后运行回调函数alert(‘Hello’)-setTimeout(function(){alert('Hello');},2000);setInterval(function,uration)-此函数在每duration毫秒后调用function。这可以无限次进行。让我们看一个例子-它每2000毫秒触发一次警

setIntervalsetIntervalAug 02, 2023 am 10:17 AM

setInterval函数是JavaScript中的一个定时器函数,允许你设置一个间隔,并在每个间隔之后执行指定的代码,需要定期处理某些任务或实时更新页面元素的情况非常有用,要注意使用setInterval时的性能和可靠性问题,并根据需要进行优化。

setinterval用法详解setinterval用法详解Sep 12, 2023 am 09:55 AM

setinterval用法是“setInterval(function, delay);”,“function”是要执行的函数,可以是函数表达式或函数引用,“delay”是执行函数之间的时间间隔,以毫秒为单位。setInterval是JavaScript中用于周期性执行代码的函数,它接受一个函数和一个时间间隔作为参数,会按照指定的时间间隔重复执行函数。

在JavaScript中使用clearTimeout函数取消setTimeout的计时器在JavaScript中使用clearTimeout函数取消setTimeout的计时器Nov 18, 2023 am 08:05 AM

在JavaScript中使用clearTimeout函数取消setTimeout的计时器,需要具体代码示例在JavaScript中,setTimeout函数是用来在指定的时间延迟后执行一次特定的代码。而setInterval函数则是用来在指定的时间间隔内重复执行一段特定的代码。然而,在某些情况下,我们可能需要在定时器执行之前取消它。在这种情况下,就可以使用c

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa