var Cat = function(name) {
this.name = name;
}
Cat.prototype.miao = function() {
console.log("miao miao miao");
setTimeout(this.miao(), 1000);
}
var cat = new Cat("hahaha");
cat.miao();
上面代码有什么问题吗?
理应1秒调用一次miao()函数,,但是调用次数之多之快却导致了浏览器奔溃
同意 斑驳光影 说的内容。
另外再补充一下,如果不用
bind
这个方法,直接写成你会发现程序打出了 两个
miao miao miao
然后就停止了。在解释这个问题前,我们首先把
setTimeout
方法写成这样:在第一次调用
setTimeout(this.miao,1000)
中,这个this
,指代的是Cat
构造函数new
出来的实例。递归运行后,打印了第二个miao miao miao
后,调用setTimeout(this.miao,1000)
,此时this
相当于在上一个setTimeout
的fn
中调用了。因此指代的是全局变量window
, 它并没有miao
方法,因此会报错。程序也就因此停止了。简而言之,在
setTimeout(fn,ms)
中,fn
内部的this
指代window
,如果fn
本身就是this.method
,这个this
就指代所运行时的环境变量。e.g.