this指向问题

clipboard.png

我知道setTimeouts window调用的,所以这个this.name中的this指向window。但是name没定义过输出了1,2是什么原因呢?求大神指教……

阅读 2.8k
4 个回答

undefined才是你输出的this.name,下面的输出其实是chrome的控制台在计数器的输出。

补充,
此外,你的setTimeout的调用方法也不对,这样的写法其实是立即执行,传入的第一个参数应该是函数形式才是正常的调用。

clipboard.png

这里的输出具体应该是插入到js主进程的任务队列数量。

当然其他情况下并不一定是,也有可能是变量值,或是一个函数的返回值。

1、2是控制台返回的 setTimeout 返回的 ID,是浏览器window对象返回的
在每个窗口,这个计数器 ID 都是唯一的,用以清除计数器

计数器的问题我就不说了,楼上已经说了,楼主写的method会立即执行,我想说下this的问题,在setTimeout中this确实指向window,但是你这么调用的话,立即执行,this是指向obj的。看下面代码弹出的name值就是window.name了

var name = 111;
var obj = {
    name: '222',
    method: function() {
        console.log(this);
        console.log(this.name);
    }
}
setTimeout(obj.method, 1000);  // 1s之后输出111

这一行才是clipboard.png

推荐问题