Javascript 为什么这是指外部变量?

Javascript 为什么这是指外部变量?,javascript,json,object,Javascript,Json,Object,这应该是指对象本身,但在下面的代码中,为什么它的行为不同 var x = 4, obj = { x: 3, bar: function() { var x = 2; setTimeout(function() { var x = 1; alert(this.x); }, 1000); } };

这应该是指对象本身,但在下面的代码中,为什么它的行为不同

var x   = 4,
    obj = {
        x: 3,
        bar: function() {
            var x = 2;
            setTimeout(function() {
                var x = 1;
                alert(this.x);
            }, 1000);
        }
    };
obj.bar();
为什么警报是4而不是3?

在回调中,这指的是窗口对象,所以它正在检索全局上下文中定义的变量

您可以通过使用方法绑定此上下文使其工作

var x=4, obj={ x:3, 酒吧:功能{ var x=2; setTimeoutfunction{ var x=1; alertthis.x; }.这个,1000; } }; obj.bar 在回调内部,它引用窗口对象,所以它正在检索在全局上下文中定义的变量

您可以通过使用方法绑定此上下文使其工作

var x=4, obj={ x:3, 酒吧:功能{ var x=2; setTimeoutfunction{ var x=1; alertthis.x; }.这个,1000; } };
obj.bar;因为这引用了全局objectRelated:。MDN在中也有关于此的部分。因为它引用了全局objectRelated:。MDN在中也有关于这一点的部分;在我工作的所有代码库中。你的回答让我想知道,bind和that之间的权衡是什么?@JamesCollier:查看文档:我理解,但从性能上看,使用.bind与将其缓存在变量中有何不同?@JamesCollier:两者都可以使用。。。我不知道哪一个更好…@JamesCollier:我认为缓存可能更好,你可以在任何地方使用,而不需要更多的复杂性。。。否则,如果存在多个函数,则需要绑定每个案例……我看到一行:var that=this;在我工作的所有代码库中。你的回答让我想知道,bind和that之间的权衡是什么?@JamesCollier:查看文档:我理解,但从性能上看,使用.bind与将其缓存在变量中有何不同?@JamesCollier:两者都可以使用。。。我不知道哪一个更好…@JamesCollier:我认为缓存可能更好,你可以在任何地方使用,而不需要更多的复杂性。。。否则,如果存在多个函数,则需要绑定每个案例。。。