为什么this.name
会返回未定义的我?
function EventEmitter() {
var events = {};
this.name = "Google"
this.on = function(name, fn) {
events[name] = events[name] || [];
events[name].push(fn);
}
this.trigger = function(name, args) {
events[name] = events[name] || [];
args = args || [];
events[name].forEach(function(fn) {
fn.apply(this, args);
});
}
}
var my_event_emitter = new EventEmitter();
my_event_emitter.on('curtain_dropped', function() {
console.log(this.name);
});
my_event_emitter.trigger('curtain_dropped', [true]);
当我调用fn.apply(this, args)
时,this
不是EventEmitter
的实例,即my_event_emitter
?
发布于 2015-01-01 20:19:47
forEach有自己的上下文。使用三种方法中的一种来绑定新上下文,例如:
events[name].forEach(function(fn) {
fn.apply(this, args);
}.bind(this));
您还可以传递上下文(作为2 arg传递给forEach)。回调的参数是(值、索引、originalArray、上下文);
events[name].forEach(function(fn) {
fn.apply(this, args);
},this);
发布于 2015-01-01 20:18:26
否;this
是调用forEach
回调的上下文。
默认情况下,这是全局对象。
您需要向forEach()
传递第二个参数,以告诉它回调中的this
应该是什么。
发布于 2015-01-01 20:19:19
因为下面的代码行:
events[name].forEach(function(fn) {
fn.apply(this, args);
});
当您调用apply
时,您提供了错误的this
引用,因为您在forEach
闭包中。
如果希望在EventEmitter
上提供this
实例引用,则需要将其存储在变量中,并在闭包中使用它:
function EventEmitter() {
var events = {};
var that = this; // <-- Current instance reference!
this.name = "Google"
this.on = function(name, fn) {
events[name] = events[name] || [];
events[name].push(fn);
}
this.trigger = function(name, args) {
events[name] = events[name] || [];
args = args || [];
events[name].forEach(function(fn) {
fn.apply(that, args); // Provide "that" instead of "this"
});
}
}
https://stackoverflow.com/questions/27734273
复制相似问题