在Javascript中在类里用setTimeout的一些问题

functionxilou(){this.name="xilou";this.sex="男";this.num=0;}xilou.prototype.count=func... function xilou(){

this.name="xilou";
this.sex="男";
this.num=0;
}

xilou.prototype.count=function(){
this.num+=1;
alert(this.sex+this.num+this.name);
alert(this.count)

var self=this;

//setTimeout(function(){self.count();},1000); //D:正确
//setTimeout('self.count()',1000)// can't do it

}
var x=new xilou();
x.count();

为什么第一种正确,第二种不行,第二种的self不就相当于x吗?
展开
 我来答
xi8km9
2014-11-09 · TA获得超过1086个赞
知道小有建树答主
回答量:688
采纳率:50%
帮助的人:713万
展开全部

这是有关於javascript变量作用域的问题

你能提出这个问题可能时受了eval使用的影响

setTimeout与eval不一样


eval在运行时是改变作用域/this的

而setTimeout的作用域是window

比如以下代码

(function(){console.log(this),eval('console.log(this)'),setTimeout('console.log(this)',0)}).call({Test:!0})

你运行下看看


说完上面的


再针对与你现在这个具体的代码说明下

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

你在此生成了个匿名函数,在这个函数调用时会逐层的找self这个玩意,由於javascript对作用域的解释,故而能找到你要的self

setTimeout('self.count()',1000)

此处给setTimeout的是字符串,其作用域是window,故而找不到self


关於javascript的作用域的问题 嗯 多看些文档加深下理解吧~~

婪兜
2014-11-09 · 超过29用户采纳过TA的回答
知道答主
回答量:84
采纳率:0%
帮助的人:56.7万
展开全部
setTimeout(code,millisec)中code包含形参,
因为setTimeout会将code转化成一个function 对象,第二种方法虽然也能成功封装出function对象,但是定时器在self的可见域外执行code,所以self得不到正确的传递.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式