如何在同一个对象中调用另一个函数?

时间:2016-12-25 21:12:00

标签: javascript ecmascript-6

let role = {
    test: (variable) => {
        // How do I call toLog(variable) from here?
    },
    toLog: (variable) => {
        console.log(variable);
    }
};

我想在test()函数中调用toLog()函数,但我不知道如何。

1 个答案:

答案 0 :(得分:14)

标准JS函数使用动态绑定,this取决于谁在运行时调用方法,因此如果我们使用role.test()调用它,它会将this绑定到role }。

箭头函数将this绑定到当前上下文。例如,如果代码在浏览器的控制台中是写的,则this绑定到window对象。这称为静态词法绑定,这意味着将this绑定到它所定义的闭包。

如果您不使用箭头功能,thisrole调用时会指向对象本身:

const role = {
    test(variable){
        this.toLog(variable);
    },
    toLog(variable) {
        console.log(variable);
    }
};

role.test(5);

在这种情况下,我们不希望将this绑定到外部上下文,因此我们将跳过静态绑定以支持动态绑定。

但是,如果我们将此方法用作回调,则动态绑定将根据运行该方法的人员更改this。为防止这种情况发生,我们必须使用bind创建与role的显式静态绑定。

const role = {
  test(variable) {
      this.toLog(variable);
    },
    toLog(variable) {
      console.log(variable);
    }
};

let test = role.test;

try {
  test(20); // will throw an error - this.toLog is not a function - because this points to window
} catch (e) {
  console.log(e);
}

test = role.test.bind(role);

test(25); // will work because it's staticly binded to role