当前位置: 首页 > 面试题库 >

为什么在使用诺言时在类方法中未定义“ this”?[重复]

墨宜人
2023-03-14
问题内容

我有一个javascript类,每个方法都返回一个QPromise。我想知道为什么thismethod2和中未定义method3。有没有更正确的方法来编写此代码?

function MyClass(opts){
  this.options = opts;

  return this.method1()
    .then(this.method2)
    .then(this.method3);
}

MyClass.prototype.method1 = function(){
  // ...q stuff...

  console.log(this.options); // logs "opts" object

  return deferred.promise;
};

MyClass.prototype.method2 = function(method1resolve){
  // ...q stuff...

  console.log(this); // logs undefined

  return deferred.promise;
};

MyClass.prototype.method3 = function(method2resolve){
  // ...q stuff...

  console.log(this); // logs undefined

  return deferred.promise;
};

我可以使用bind以下方法解决此问题:

function MyClass(opts){
  this.options = opts;

  return this.method1()
    .then(this.method2.bind(this))
    .then(this.method3.bind(this));
}

但是不能完全确定为什么bind有必要。正在.then()消灭this


问题答案:

this始终是调用方法的对象。但是,将方法传递给时then(),您不会调用它!该方法将存储在某个位置,稍后再从那里调用。如果要保存this,则必须这样做:

.then(() => this.method2())

或者,如果您必须在ES6之前的版本中执行此操作,则需要保留以下内容this

var that = this;
// ...
.then(function() { that.method2() })


 类似资料:
  • 问题内容: 我有一个javascript类,每个方法都返回一个Promise。我想知道为什么在和中未定义。有没有更正确的方法来编写此代码? 我可以使用以下方法解决此问题: 但是不能完全确定为什么有必要。正在消灭? 问题答案: 始终是调用方法的对象。但是,将方法传递给时,您不会调用它!该方法将存储在某个地方,稍后再从那里调用。如果要保存,则必须这样做: 或者,如果您必须在ES6 之前的版本中进行操作

  • 问题内容: 我试图制作一个延迟X毫秒执行异步函数的函数。 为了演示的目的,以下是异步函数,该函数采用URL: 目的 我在这里的目标是要有一个函数,它将接受X 的参数,然后每隔X ms调用一次,直到不再有其他参数为止。 基本上,我希望每次调用都用X ms分隔。 例如,假设我连续打电话20次。通常,这20个呼叫将立即进行。我想要的是确保20个呼叫之间都存在Xms的延迟。 暂定 解决这个问题的想法是建立

  • 问题内容: 在严格模式下使用javascript时,为什么在匿名函数中未定义此函数?我知道为什么这样做可能有意义,但是我找不到任何具体答案。 例: 问题答案: 这是因为,在ECMAscript 262第5版之前,如果使用的人忘记使用该关键字,那会造成很大的混乱。如果在ES3中调用构造函数时忘了使用,请引用全局对象(在浏览器中),然后用变量破坏全局对象。 这是可怕的行为等人在ECMA决定,只是为了集

  • 问题内容: 我正在使用Vue.js创建一个组件。 当我引用中的任何所述的生命周期钩(,,等等)它的计算结果为: 我的计算属性内部也发生了同样的事情: 我收到以下错误: 未捕获的TypeError:无法读取未定义的属性“ bar” 为什么要在这些情况下进行评估? 问题答案: 这两个示例都使用arrow函数,该函数绑定到与Vue实例不同的上下文。 根据文档: 不要在实例属性或回调(例如)上使用箭头功能

  • 问题内容: 单击锚标签并将ID设置为href时,我正在执行ajax请求。顺便说一句,该锚标记是动态创建的。 单击锚标记后,将执行以下代码: 当我尝试显示$(this).attr(’href’)时,它说它是“未定义的”。我真正想做的是fadeOut锚标记,但是当我调查$(this)的值时,它是“未定义”的。 上面的代码段可能有什么问题? 问题答案: 你应该试试 因为在回调中不是clicked元素,所

  • 问题内容: 例: 我发现上面的代码在Java中是完全合法的。我有以下问题。 在方法内部拥有类定义的用途是什么? 是否会为生成一个类文件 我很难以面向对象的方式来想象这个概念。在行为中具有类定义。也许有人可以用等效的真实例子告诉我。 方法中的抽象类对我来说听起来有点疯狂。但不允许使用任何接口。这背后有什么原因吗? 问题答案: 这称为本地课程。 2很简单:是的,将生成一个类文件。 1和3是同一个问题。