javascript - 如何在 javascript 类回调中绑定(bind) this 的正确值?

标签 javascript ecmascript-6 es6-class

<分区>

class SomeClass {
  constructor() {
     this.x = 0;
  }
  getSomething(inputVal) {
   let self = this;
   return new Promise((resolve, reject) => {
    setTimeout(function(){
     if(inputVal){
       self.x = 1;
       resolve();
     }
     else{
       self.x = -1;
       reject();
     }

   }, 10);
 });
}

我必须使用一个名为 self 的变量来引用 this。这是错误的做法吗?如果没有,我还能怎么做?

最佳答案

Is this wrong to do?

不,显然那个方法并没有错,它只是一种保持对this引用的方法。目的。

但是对于这个问题还有一些替代方法:

1。使用 bind方法。

The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.

getSomething(inputVal) {
        return new Promise((resolve, reject) => {
            setTimeout(function(){
                if(inputVal){
                    this.x = 1;
                    resolve();
                }
                else{
                    this.x = -1;
                    reject();
                }

            }.bind(this), 10);
        });
 }

2。使用 arrow功能。

直到 arrow函数,每个 new 函数定义了自己的this值(value)。

例如,this在构造函数的情况下可以是一个新对象。

function Person(age){
  this.age=age;
  console.log(this);
}
let person=new Person(22);

this可以指向base对象,如果创建的函数可以像obj.getAge()那样被访问.

let obj={
  getAge:function(){
    console.log(this);
    return 22;
  }
}
console.log(obj.getAge());

arrow函数不创建自己的 this , 它只是使用了 this enclosing 的值(value)执行context .另一方面,arrow函数使用 this父范围。

getSomething(inputVal) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (inputVal) {
                this.x = 1;
                resolve();
            }
            else {
                this.x = -1;
                reject();
            }

        }, 10);
    });
}

关于javascript - 如何在 javascript 类回调中绑定(bind) this 的正确值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47767331/

相关文章:

javascript - 使用和不使用 new() 预先实例化它们来导出 ES6 类

javascript - 实例化并使用 2 个或更多 JavaScript ES6 类

javascript - 正确地将参数传递给 react 方法

javascript - ES6 生成器函数中星号 (*) 的用途是什么

javascript - 解构赋值默认值

javascript - 为什么以及何时我们需要在 React 中绑定(bind)函数和事件处理程序?

javascript - 如何创建适合移动设备的响应式菜单?

javascript - 你能帮我处理剪刀石头布游戏 javascript 和一些 HTML 吗?

javascript - laravel中编译vue js前端时出错

javascript - 如何过滤对象中特定键对应的值?