作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个构造函数,它注册了一个事件处理程序:
function MyConstructor(data, transport) {
this.data = data;
transport.on('data', function () {
alert(this.data);
});
}
// Mock transport object
var transport = {
on: function(event, callback) {
setTimeout(callback, 1000);
}
};
// called as
var obj = new MyConstructor('foo', transport);
data
属性。看起来
this
不是指创建的对象,而是指另一个对象。
function MyConstructor(data, transport) {
this.data = data;
transport.on('data', this.alert);
}
MyConstructor.prototype.alert = function() {
alert(this.name);
};
最佳答案
关于this
this
(也称为“上下文”)是每个函数中的一个特殊关键字,其值仅取决于如何调用该函数,而不是如何/何时/何地定义它。它不受词汇范围的影响,如其他变量(除了箭头函数,见下文)。下面是一些例子:
function foo() {
console.log(this);
}
// normal function call
foo(); // `this` will refer to `window`
// as object method
var obj = {bar: foo};
obj.bar(); // `this` will refer to `obj`
// as constructor function
new foo(); // `this` will refer to an object that inherits from `foo.prototype`
this
,请看
MDN documentation。
this
this
this
,而是要访问它所引用的对象。这就是为什么一个简单的解决方案是简单地创建一个新的变量,它也引用那个对象。变量可以有任何名称,但常见的名称是
self
和
that
。
function MyConstructor(data, transport) {
this.data = data;
var self = this;
transport.on('data', function() {
alert(self.data);
});
}
self
值。
this
-第1部分
this
的值,因为它的值是自动设置的,但事实并非如此。
this
[docs]方法,该方法返回一个新函数,其中
.bind
绑定到一个值。该函数与您调用的
this
on的行为完全相同,只是由您设置了
.bind
。无论如何或何时调用该函数,
this
都将始终引用传递的值。
function MyConstructor(data, transport) {
this.data = data;
var boundFunction = (function() { // parenthesis are not necessary
alert(this.data); // but might improve readability
}).bind(this); // <- here we are calling `.bind()`
transport.on('data', boundFunction);
}
this
绑定到
this
's
MyConstructor
的值。
this
[docs]。这样做的原因是,在取消绑定事件回调时不需要存储对函数的引用。jquery在内部处理这个问题。
jQuery.proxy
绑定。相反,在作用域中查找
this
就像在正常变量中查找一样。这意味着您不必调用
this
。这不是他们唯一的特殊行为,请参阅MDN文档以获取更多信息。
function MyConstructor(data, transport) {
this.data = data;
transport.on('data', () => alert(this.data));
}
.bind
-第2部分
this
应该引用的值。这基本上和你自己绑定一样,但是函数/方法为你做了。
this
[docs]就是这样一种方法。其签名为:
array.map(callback[, thisArg])
Array#map
应该引用的值。下面是一个人为的例子:
var arr = [1, 2, 3];
var obj = {multiplier: 42};
var new_arr = arr.map(function(v) {
return v * this.multiplier;
}, obj); // <- here we are passing `obj` as second argument
this
method [docs]描述了一个名为
this
的选项:
function Foo() {
this.data = 42,
document.body.onclick = this.method;
}
Foo.prototype.method = function() {
console.log(this.data);
};
$.ajax
被指定为单击事件处理程序,但如果单击
context
,则记录的值将为
this.method
,因为在事件处理程序内部,
document.body
指的是
undefined
,而不是
this
的实例。
document.body
指的是什么取决于函数是如何调用的,而不是如何定义的。
function method() {
console.log(this.data);
}
function Foo() {
this.data = 42,
document.body.onclick = this.method;
}
Foo.prototype.method = method;
Foo
将
this
显式绑定到特定值。
document.body.onclick = this.method.bind(this);
.bind
)分配给另一个变量:
var self = this;
document.body.onclick = function() {
self.method();
};
document.body.onclick = () => this.method();
关于javascript - 如何在回调中访问正确的“this”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53691094/
我是一名优秀的程序员,十分优秀!