我从本教程中提取了以下代码:tutorial
如果你可以将它从父函数绑定到匿名内部函数,那么如果你想稍后在匿名内部函数中引用“this”,你会怎么做?匿名内部函数不存在“this”吗?
render: function ()
{
this.getAsyncData(function () {
this.specialFunction();
this.anotherSpecialFunction();
}.bind(this));
}
答案 0 :(得分:3)
如果你想稍后在匿名内部函数中引用“this”,你会怎么做?
如果我们没有调用this
,则无法引用回调所具有的.bind
的值。
但是,您不必使用.bind
,还有其他方法可以使用“父”功能的this
值:How to access the correct `this` context inside a callback?
匿名内部函数不存在“this”吗?
this
是每个函数中的隐含值。它具有哪个值取决于函数如何调用,除非该函数明确绑定到某个值(通过.bind
)。
例如,如果您“正常”调用某个函数,例如func()
,则this
将引用全局对象(浏览器中为window
)。 API文档通常会解释回调中的this
值。如果它没有明确提及任何内容,那么你可以假设this
引用了全局对象,这在大多数情况下都不是很有用,因此通过{{1}“覆盖”它是没有问题的。 }。
但即使.bind
在回调中设置为特定值,该值也经常作为参数传递给回调。能够通过this
访问该值只是为了方便。但同样,这取决于API的设计方式,通常在API文档中进行了解释。
有关this
的详细信息,请查看MDN documentation。
答案 1 :(得分:1)
每次调用函数时都会设置this
上下文。如果没有上下文(大多数回调的情况),则this
将丢失。
更常见的是:
var self = this;
// code using self instead of this here
由于.bind
相对较新,上述内容更兼容浏览器。
答案 2 :(得分:0)
当您进行匿名回调时,this
通常会引用window
对象。一个很好的例子是setTimeout
:
var someObject = {
set: function() { /* ... */ },
doSomething: function() {
// right here, "this" is "someObject"
setTimeout(function() {
// whereas right here, "this" is "window"
});
}
}
很多人都是这样解决这个冲突的:
var someObject = {
set: function() { /* ... */ },
doSomething: function() {
var that = this;
setTimeout(function() {
console.log(that) // => now it refers to "doSomething"
});
}
}
bind
发挥作用的地方。
请参阅此jsfiddle:
var someObject = {
set: function() { /* ... */ },
doSomething: function() {
setTimeout(function() {
console.log(this) // => now it refers to "doSomething"
}.bind(this));
}
}
someObject.doSomething()
,而不是将doSomething()
方法称为不同的上下文。
答案 3 :(得分:0)
如果你可以将它从父函数绑定到匿名内部函数,那么如果你想稍后在匿名内部函数中引用“this”,你会怎么做?
如果您想引用外部this
,然后将this
设置为变量而不使用bind,则无法使用。
var that = this;
匿名内部函数不存在“this”吗?
this
始终存在。
简单示例:
this.name = 'Bob';
function sayHello() {
return ['Hello,', this.name].join(' ');
}
console.log(sayHello()); // "Hello, Bob"
console.log(sayHello.bind({name: 'Ana'})()); // "Hello, Ana"