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:我认为缓存可能更好,你可以在任何地方使用,而不需要更多的复杂性。。。否则,如果存在多个函数,则需要绑定每个案例。。。