Javascript ES6 Arrow函数与ES5:如何知道在使用ES5非Arrow函数时将'this'绑定到哪个函数
我正在阅读ES6箭头函数的使用。它给出了以下示例,其中必须使用Javascript ES6 Arrow函数与ES5:如何知道在使用ES5非Arrow函数时将'this'绑定到哪个函数,javascript,ecmascript-6,ecmascript-5,arrow-functions,Javascript,Ecmascript 6,Ecmascript 5,Arrow Functions,我正在阅读ES6箭头函数的使用。它给出了以下示例,其中必须使用bind(this),然后是带有箭头函数的相应代码 var obj = { id: 42, counter: function counter() { setTimeout(function() { console.log(this.id); }.bind(this), 1000); } }; 在ES5示例中,它表示,.bind(this)是帮助将此上下文传递到函数中所必需的 我想知道的是:为
bind(this)
,然后是带有箭头函数的相应代码
var obj = {
id: 42,
counter: function counter() {
setTimeout(function() {
console.log(this.id);
}.bind(this), 1000);
}
};
在ES5示例中,它表示,.bind(this)是帮助将此上下文传递到函数中所必需的
我想知道的是:为什么要使用bind(this)
来回调setTimeout
,而不是使用counter
函数?ie为什么上面的代码不是这样的:
var obj = {
id: 42,
counter: function counter() {
setTimeout(function() {
console.log(this.id);
}, 1000);
}.bind(this);
};
var obj = {
id: 42,
counter: function counter() {
setTimeout(function() {
console.log(this.id);
}, 1000);
}.bind(this);
};
为什么将bind(this)
与setTimeout
的回调一起使用,而不是与counter函数一起使用
因为计数器
函数(其工作方式类似于obj
对象的方法)已经具有适当的this
,因为您像obj.counter()
一样调用它,所以它从调用它为obj.counter()
中获得this
。假设将计数器调用为obj.counter()
,那么如果在counter()
函数的第一行执行console.log(this.id)
,它将正确显示id
值
但是,传递给setTimeout()
的回调没有自然的此
值,除非在回调函数本身上使用箭头函数或.bind()
,因为当setTimeout()
调用回调函数时,它不会设置特定的此
值(它只是将回调函数作为正常函数调用)因此,此
值变为默认值。这意味着如果在setTimeout()
回调中运行严格模式,则此
将是未定义的
,如果在loosey-goosey模式下运行,则全局对象将是未定义的
请参阅调用函数时设置此
值的6种方法
我还应该提到,如果你按照你的建议这样做:
var obj = {
id: 42,
counter: function counter() {
setTimeout(function() {
console.log(this.id);
}, 1000);
}.bind(this);
};
var obj = {
id: 42,
counter: function counter() {
setTimeout(function() {
console.log(this.id);
}, 1000);
}.bind(this);
};
它不仅对
setTimeout()
回调毫无帮助,而且还会将this
的错误值绑定到counter()
方法。在var obj
定义(也称为this
的词法值)之前,您将得到this
的任何内容。可能值得一提的是,在对象中这样定义的函数通常被称为方法。这有助于更好地了解它们的使用/范围,我明白了,谢谢!同时感谢@Phil的留言。实际上,等等,我仍然不明白为什么在回调中使用bind
会将this
的值设置为obj
,而在计数器中使用它会将其设置为词法值。为什么不将其应用于计数器
将计数器
绑定到obj
?@gkeenley-因为调用obj.counter()
已经将计数器
内部的设置为obj
。因此,当您使用function(){}.bind(this)
和setTimeout()
时,它将拾取this
的值(所需值)。执行.bind(this)
以计数器自身,获取当时起作用的this
值,并为计数器()设置该值。这有两个问题。首先,它是this
的错误值(它不是obj
),其次,它控制计数器作用域,而不是setTimeout()
作用域的回调,这就是问题所在。好的,一切都明白了。我很感激。