为什么 this.name 未定义
Why is this.name undefined?
为什么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
不是my_event_emitter
EventEmitter
的实例?
forEach 有自己的上下文。使用以下 3 种方法之一绑定新上下文,例如:
events[name].forEach(function(fn) {
fn.apply(this, args);
}.bind(this));
您还可以传递(作为 forEach 的 2 个参数)上下文。回调的参数是(值、索引、原始数组、上下文);
events[name].forEach(function(fn) {
fn.apply(this, args);
},this);
No; this
是调用forEach
回调的上下文。
默认情况下,这是全局对象。
您需要将第二个参数传递给forEach()
,以告诉它回调中应该this
什么。
由于以下代码行:
events[name].forEach(function(fn) {
fn.apply(this, args);
});
当你调用apply
时,你给出了错误的this
参考,因为你在forEach
闭包内。
如果要在 this
上提供EventEmitter
实例引用,则需要将其存储在变量中并在闭包中使用它:
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"
});
}
}
相关文章:
- 为什么“;未定义的“;在JavaScript中结束循环
- 要求未定义JS回调参数
- 如何检查管道中未定义的项目
- TypeError:无法读取属性'推'未定义的JavaScript
- $window.ga在AngularJS事件中未定义
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 无法获取属性'selectedIndex'的未定义引用或null引用
- 如何消除代码中的未定义和其他问题
- 骨干's Router.execute(callback,args,name)方法获取未定义的名称
- Sailsjs:TypeError:无法读取属性'name'的未定义
- 无法设置属性'name'的未定义JS
- 为什么 this.name 未定义
- 无法读取属性“”;name”;的未定义
- Javascript:“;无法读取属性“”;name”;未定义的“;本地javascript代码出错
- Internet Explorer中未定义constructor.name
- Javascript未定义为属性*name*
- 在数组中的复选框上调用.name将返回未定义
- 未捕获的错误:不匹配的匿名定义()模块:函数定义(name, global)
- 当使用window.frames[name]访问时,iframe contentWindow未定义