关于setTimeout()中的this指向存在一些疑问。

 var x = 1;
    var o = {
        x: 2,
        y: function() {
            console.log(this.x);
        }
    };
    setTimeout(o.y, 1000); 
    
执行结果是:1,this指向了window
 var x = 1;
    var o = {
        x: 2,
        y: function() {
            console.log(this.x);
        }
    };
    setTimeout(o.y(), 1000); 

执行结果是:2,this指向了o

为什么加了()会改变this的指向?

阅读 2.6k
5 个回答

o.y是传递一个函数,这是window.setTimeout(fn,times)的语法,表示经过times毫秒后执行fn,显然执行者是window

o.y()就表示执行该函数,立即执行,跟定时器没关系,此时执行者就是o

加括号表示调用,不加括号表示函数体,第一次是window调用所以得到结果是1和this指向window 而第二次也正如你打的,加了括号之后是对象o调用的,这样的话当然指向对象自己所以是2.

前一个等同于

setTimeout(function() {
    console.log(this.x);
}, 1000);

setTimeout 内部this指向window

后一个等同于

o.y()
setTimeout(undefined, 1000); 

o执行的y,this指向o

o.yfunction, 1s后执行
o.y()立即执行, 结果是2

1 属于直接调用,指向全局;
2 属于方法调用,指向方法的调用者。

具体可参考 链接

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题