首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么this.name是未定义的?

为什么this.name是未定义的?
EN

Stack Overflow用户
提问于 2015-01-01 20:15:46
回答 3查看 308关注 0票数 1

为什么this.name会返回未定义的我?

代码语言:javascript
运行
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-01 20:19:47

forEach有自己的上下文。使用三种方法中的一种来绑定新上下文,例如:

代码语言:javascript
运行
复制
events[name].forEach(function(fn) {
  fn.apply(this, args);
}.bind(this));

您还可以传递上下文(作为2 arg传递给forEach)。回调的参数是(值、索引、originalArray、上下文);

代码语言:javascript
运行
复制
events[name].forEach(function(fn) {
  fn.apply(this, args);
},this);
票数 3
EN

Stack Overflow用户

发布于 2015-01-01 20:18:26

否;this是调用forEach回调的上下文。

默认情况下,这是全局对象。

您需要向forEach()传递第二个参数,以告诉它回调中的this应该是什么。

票数 2
EN

Stack Overflow用户

发布于 2015-01-01 20:19:19

因为下面的代码行:

代码语言:javascript
运行
复制
events[name].forEach(function(fn) {
  fn.apply(this, args);
});

当您调用apply时,您提供了错误的this引用,因为您在forEach闭包中。

如果希望在EventEmitter上提供this实例引用,则需要将其存储在变量中,并在闭包中使用它:

代码语言:javascript
运行
复制
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"
    });
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27734273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档