javascript - 为什么settimeout中的函数this指向window?
PHP中文网
PHP中文网 2017-04-11 11:56:40
[JavaScript讨论组]
var obj = {
    name: 'name',
    foo: function () {
        console.log(this); // Object {name: "name"}
        setTimeout(function () {
            console.log(this);  // Window
        }, 1000);
    },
    foo2: function () {
        console.log(this); // Object {name: "name"}
        setTimeout(() => {
            console.log(this);  // Object {name: "name"}
        }, 2000);
    }
}

为什么settimeout中的函数this指向window?而箭头函数this指向Object

是因为settimeout是window对象的方法还是说当做直接调用一个函数?

PHP中文网
PHP中文网

认证0级讲师

全部回复(4)
伊谢尔伦

这个就是关于this指向的问题了,setTimeout中的function你可以理解为callback,

function callback(){}  
setTimeout(callback,2000);

这样不知道你能否理解?
setTimout中的执行伪代码可以理解为:

function setTimeout(fn,delay) {
// 等待delay 毫秒
fn(); // <-- 调用位置!
}

可以看到,他是直接调用fn(),前面没有给任何对象绑定在一起,所以根据JavaScript的规则,它属于默认绑定,自然就是window了,不知道你能否理解?如果你想改变他得绑定对象,可以使用bind去绑定。
再说说箭头函数,在ES6中箭头函数的this是指向父级作用域的(不是很准确),你的foo2中使用的箭头函数,因此默认会指向obj,
如果你将

var fooo = obj.foo2;
fooo()

这样this不会指向obj而是会指向window,

var b = {name:''};
b.foo = obj.foo2;
b.foo();

这样呢this会指向b,
建议去查看一下this的四种绑定机制和作用域

大家讲道理

是因为settimeout在全局环境window中执行吗?

对,是因为这个,简单了说,函数中的this指向的是运行时的上下文,因此是window;而箭头函数会帮你把this绑定到声明时的上下文,因此还是Object

天蓬老师

箭头函数有绑定this的作用
settimeout是异步的代码 等到执行的时候 不一定程序已经运行到哪了 所以用this的时候就不是同一个环境了

伊谢尔伦

楼上说的很好了,箭头函数类似于foo3

var obj = {
    name: 'name',
    foo: function () {
        console.log(this); // Object {name: "name"}
        setTimeout(function () {
            console.log(this);  // Window
        }, 1000);
    },
    foo2: function () {
        console.log(this); // Object {name: "name"}
        setTimeout(() => {
            console.log(this);  // Object {name: "name"}
        }, 2000);
    },
    foo3: function(){
        console.log(this);
        setTimeout(function(){console.log(this);}.bind(this), 2000)
    }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号