对象不支持属性或方法dbzz.html,JavaScript 中 setTimeout()的用法 ZZ

第一篇

setTimeout()在js类中的使用方法 setTimeout (表达式,延时时间)

setTimeout(表达式,交互时间)

延时时间/交互时间是以豪秒为单位的(1000ms=1s)

setTimeout 在执行时,是在载入后延迟指定时间后,去执行一次表达式,仅执行一次

setTimeout 在执行时,它从载入后,每隔指定的时间就执行一次表达式

1,基本用法:

执行一段代码:

var i=0;

setTimeout("i+=1;alert(i)",1000);

执行一个函数:

var i=0;

setTimeout(function(){i+=1;alert(i);},1000);

//注意比较上面的两种方法的不同。

下面再来一个执行函数的:

var i=0;

function test(){

i+=1;

alert(i);

}

setTimeout("test()",1000);

也可以这样:

setTimeout(test,1000);

总结:

setTimeout的原型是这样的:

iTimerID =

window.setTimeout(vCode, iMilliSeconds [, sLanguage])

setTimeout有两种形式

setTimeout(code,interval)

setTimeout(func,interval,args)

其中code是一个字符串

func是一个函数.

注意"函数"的意义,是一个表达式,而不是一个语句.

比如你想周期性执行一个函数

function a(){

//...

}

可写为

setTimeout("a()",1000)

setTimeout(a,1000)

这里注意第二种形式中,是a,不要写成a(),切记!!!

展开来说,不管你这里写的是什么,如果是一个变量,一定是一个指向某函数的变量;如果是个函数,那它的返回值就 要是个函数

2,用setTimeout实现setInterval的功能

思路很简单,就是在一个函数中调用不停执行自己,有点像递归

var

i=0;

function

xilou(){

i+=1;

if(i>10){alert(i);return;}

setTimeout("xilou()",1000);

//用这个也可以

//setTimeout(xilou,1000);

}

3,在类中使用setTimeout

终于到正题了,其实在类中使用大家遇到的问题都是关于this的,只要解决了这个this的问题就万事无忧了。

呵呵。让我们来分析一下:

function

xilou(){

this.name="xilou";

this.sex="男";

this.num=0;

}

xilou.prototype.count=function(){

this.num+=1;

alert(this.num);

if(this.num>10){return;}

//下面用四种方法测试,一个一个轮流测试。

setTimeout("this.count()",1000);//A:当下面的x.count()调用时会发生错误:对象不支持此属性或方法。

setTimeout("count()",1000);//B:错误显示:缺少对象

setTimeout(count,1000);//C:错误显示:'count'未定义

//下面是第四种 var self=this;

setTimeout(function(){self.count();},1000);//D:正确

}

var x=new

xilou();

x.count();

错误分析:

A:中的this其实指是window对象,并不是指当前实例对象

B:和C:中的count()和count其实指的是单独的一个名为count()的函数,但也可以是window.count(),因为window.count()可以省略为count()

D:将变量self指向当前实例对象,这样js解析引擎就不会混肴this指的是谁了。

话说回来,虽然我们知道setTimeout("this.count()",1000)中的this指的是window对象,但还是不明白为什么会是

window对象^_^(有点头晕...)

那我们可以想象一下这个setTimeout是怎样被定义的:

setTimeout是window的一个方法,全称是这样的:window.setTimeout()

那应该是这样被定义的:

window.setTimeout=function(vCode, iMilliSeconds [,

sLanguage]){

//.....代码

return timer//返回一个标记符

}

所以当向setTimeout()传入this的时候,当然指的是它所属的当前对象window了。

第二篇

今晚看到QLeelulu的一道JavaScript面试题(setTimeout),稍微想了一下,好不容易连猜带蒙,凑巧说对了答案。但是原因到底是什么呢?自己一时也说不太清楚,反正感觉就是一个死循环造成的。然后看了一下文章下面的评论,发现5楼和6楼的回答很有道理,主要意思就是说javascript引擎是单线程执行的,while循环那里执行的时候,settimeout里面的函数根本没有执行的机会,这样while那里永远为真,造成死循环。但是单纯看还是不怎么踏实,最后发挥实践精神,自己动手做了两个实验:

1、简单的settimeout

setTimeout(function () { while (true) { } }, 1000);

setTimeout(function () { alert('end 2'); }, 2000);

setTimeout(function () { alert('end 1'); }, 100);

alert('end');

执行的结果是弹出‘end’‘end 1’,然后浏览器假死,就是不弹出‘end

2’。也就是说第一个settimeout里执行的时候是一个死循环,这个直接导致了理论上比它晚一秒执行的第二个settimeout里的函数被阻塞,这个和我们平时所理解的异步函数多线程互不干扰是不符的。

2、ajax请求回调

接着我们来测试一下通过xmlhttprequest实现ajax异步请求调用,主要代码如下:

var xmlReq = createXMLHTTP();//创建一个xmlhttprequest对象

function testAsynRequest() {

var url = "/AsyncHandler.ashx?action=ajax";

xmlReq.open("post", url, true);

xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

xmlReq.onreadystatechange = function () {

if (xmlReq.readyState == 4) {

if (xmlReq.status == 200) {

var jsonData = eval_r('(' + xmlReq.responseText + ')');

alert(jsonData.message);

}

else if (xmlReq.status == 404) {

alert("Requested URL is not found.");

} else if (xmlReq.status == 403) {

alert("Access denied.");

} else {

alert("status is " + xmlReq.status);

}

}

};

xmlReq.send(null);

}

testAsynRequest();//1秒后调用回调函数

while (true) {

}

在服务端实现简单的输出:

private void ProcessAjaxRequest(HttpContext context)

{

string action = context.Request["ajax"];

Thread.Sleep(1000);//等1秒

string jsonObject = "{\"message\":\"" + action + "\"}";

context.Response.Write(jsonObject);

}

理论上,如果ajax异步请求,它的异步回调函数是在单独一个线程中,那么回调函数必然不被其他线程”阻挠“而顺利执行,也就是1秒后,它回调执行弹出‘ajax’,可是实际情况并非如此,回调函数无法执行,因为浏览器再次因为死循环假死。

结论:根据实践结果,可以得出,javascript引擎确实是单线程处理它的任务队列(能理解成就是普通函数和回调函数构成的队列吗?)的。在javascript里实现异步编程很大程度上就是一种障眼法,单线程的引擎实现多线程的编程,如果要实现一些资源同步互斥之类的操作(一如C#、Java等语言的多线程),我感觉真正实现起来根本无法轻易得到保证。

补充:如何实现javascript的sleep呢?在stackoverflow上找到一篇javascript

sleep,试了一下,效果是有了,但是执行的时候cpu很高,真还不如直接settimeout呢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值