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()函数,,但是调用次数之多之快却导致了浏览器奔溃
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
同意 斑驳光影 说的内容。
另外再补充一下,如果不用
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.
setTimeout的用法是:而你的写法直接传入一下
this.miao(),这样setTimeout是无效的,然而它会直接循环执行this.miao()setTimeout传入的是一个function,而你直接把function执行了。。。也就是说,你在
miao函数里面又调了miao,改成这么写就行了刚才是this的指向问题,
其实你这个直接是递归建立了无数setTimeout
应该
比较懒的做法也可以直接用 arguments.callee 替代递归函数本身。
es6 es7 :: =>就会清晰多了
没必要为了以前的坑继续补,当然bind(this)也行
不过这里的问题是,你不知道引擎怎么执行的
你传一个 fn() 当参数,那么必然要执行fn才能知道return,所以他就一直执行咯.