代码如下:
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);
部分,为什么要用闭包?
因为,如果不使用self.wow(),直接使用this.wow(),当yelp()执行完以后,this对象就不存在了,那么你的程序就会出错,而采用self.wow(),当yelp()执行完成以后,self可以通过作用于链找到最近一次对他定义的值,一旦找到,就能使用这个值。所以才会采用闭包
请问一下,这个self是一直驻留在内存中的吧
@菜鸟程序猿: 嗯,是的,直到调用结束
@kuangkro: 每2秒就要运行一次,应该会一直驻留在内存中的吧
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);