setTimeout设置为0的作用

调用方式:
iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage])
功能:
Evaluates an expression after a specified number of milliseconds has elapsed. 在 超过一定的时间间隔(iMilliSeconds,这个参数以毫秒为单位,如果你输入1000,则表示一秒)之后执行表达式vCode,这个vCode可 以是一段程序,亦可以是一个函数指针,即函数名称。
例如:
window.setTimeout("alert('Hello, world')", 1000);
或函数指针
function func1() {alert("Hello, world");}
window.setTimeout(func1, 1000);

注意,在第二种调用方法中,你是不能向函数传递参数的,
例如:
function func2(message) { alert( message ); }
像以下的调用方式:
window.setTimeout(func2("Hello world"), 1000);
将产生“参数无效”的错误, 因为该写法是在调用func2方法,并非向 setTimeout 传递一个函数指针 。
要避免这种错误,那么就写成第一种方式好了:window.setTimeout("func2('Hello world')", 1000);

这个 window.setTimeout 方法的返回值什么呢? window.setTimeout 亦可解释为 “ 延迟执行 ”。
例如 window.setTimeout(func1, 5000); 表示,func1() 函数,并不在该语句执行时立即执行,
而是从该语句执行后算起,延后 5 秒执行。所以,window.setTimeout 方法的返回值本质上就是这个  “ 延迟执行 ”的进程的ID。(根《JavaScript高级程序设计》一书)。如果你在这 5 秒的等待过程中,想取消
这个进程,那个这个ID就会起作用了。通过调用 window.clearTimeout(iTimeoutID) 方法,并向该方法中传递
你在 iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage]) 中获得的ID,即可取消延迟执行。

因此,如果你想要取消 延迟执行 ,所定义的变量 iTimerID  必须是一个全局变量(global variable )。

setInterval 介绍:
iTimerID = window.setInterval(vCode, iMilliSeconds [, sLanguage]) 该方法与 window.setTimeout 
方法最大的区别是:该方法执行多次,即按一定的时间间隔不断地执行。其他方面,都是相同的。
要取消执行,可以调用。window.clearInterval(iIntervalID) 方法。

提示:如果我们在 window.setTimeout 调用的函数中,再调用一次  window.setTimeout 方法,那不是实现了 
setInterval 的效果

setTimeout为0的应用

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<title>setTimeout为0的应用</title> 
<style type="text/css"> 
body { background:url(images/page-bg.gif); font-size:14px;} 
</style> 
</head>

<body> 
<h1>setTimeout为0的应用</h1> 
<p>在下面两个输入框里输入字符,看看有什么不同?</p> 
<p> 
A:<input type="text" id="t1" name="t1" 
onkeydown="document.getElementById('t1text').innerHTML='你输入了:'+this.value;" value="" />没有使用setTimeout

</P> 
<div id="t1text">你输入了:</div> 
<p> 
B:<input type="text" id="t2" name="t2" 
onkeydown="var t2=this;setTimeout(function(){document.getElementById('t2text').innerHTML='你输入了:'+t2.value},0);" 
value="" />setTimeout为0</p> 
<div id="t2text">你输入了:</div> 
</body> 
</html>

类似起线程。前者没用settimeout ,所以是主线程去做的响应,所以在onkeydown 就触发事件执行。得到的数据会有差异。

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

先来一段代码,大家猜猜在各种浏览器下的结果会是怎么样的呢?
JScript code, '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');

上一篇:三、jQuery--Ajax基础--Ajax全接触--扩展知识(跨域)


下一篇:第一百四十六节,JavaScript,百度分享保持居中--下拉菜单