首页 新闻 会员 周边

请问setInterval里的代码为什么要用闭包?

0
悬赏园豆:10 [已解决问题] 解决于 2012-07-06 10:14

代码如下:

function Dog() {
       this.wow = function() {
               console.log("Wow");
      }
       this.yelp = function() {
              this.wow();
       }
}

function MadDog(){
}

MadDog.prototype=new Dog();

MadDog.prototype.yelp=function(){
    var self=this;
    setInterval(function(){
        self.wow();
    },2000);
}

var test=new MadDog();
test.yelp();

就是:

    var self=this;
    setInterval(function(){
        self.wow();
    },2000);

部分,为什么要用闭包?

草根程序猿的主页 草根程序猿 | 初学一级 | 园豆:129
提问于:2012-07-06 08:18
< >
分享
最佳答案
0

因为,如果不使用self.wow(),直接使用this.wow(),当yelp()执行完以后,this对象就不存在了,那么你的程序就会出错,而采用self.wow(),当yelp()执行完成以后,self可以通过作用于链找到最近一次对他定义的值,一旦找到,就能使用这个值。所以才会采用闭包

收获园豆:10
kuangkro | 菜鸟二级 |园豆:241 | 2012-07-06 09:37

请问一下,这个self是一直驻留在内存中的吧

草根程序猿 | 园豆:129 (初学一级) | 2012-07-06 10:05

@菜鸟程序猿: 嗯,是的,直到调用结束

kuangkro | 园豆:241 (菜鸟二级) | 2012-07-06 10:08

@kuangkro: 每2秒就要运行一次,应该会一直驻留在内存中的吧

草根程序猿 | 园豆:129 (初学一级) | 2012-07-06 10:14
其他回答(2)
0

参考 http://wenku.baidu.com/view/ada910d4b14e852458fb577e.html

闭包写的代码更简洁

2012 | 园豆:21230 (高人七级) | 2012-07-06 08:40
0

setInterval第一个参数是function类型,支持eval(也就是传入方法名)。

如果不闭包:var self=this;setInterval(self.wow(),2000);

这就相当于var self=this;self.wow();setInterval(undefined,2000);

就达不到延迟2秒执行self.wow();的效果,且还会报错。

正确写法:

写法一:(setInterval的第一个参数如果不是需要重复调用,此方法更简洁,且不会造成过多对象污染)

var self=this;
setInterval(
function(){
self.wow();
},
2000);

写法二:

var self=this;

function a(){
self.wow();
}

setInterval(a,2000);或setInterval('a',2000);

心未鳴 | 园豆:223 (菜鸟二级) | 2012-07-06 09:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册