JavaScript箭头功能是在创建时永久绑定还是根本没有绑定:对象和类方法的情况

时间:2018-07-21 17:02:23

标签: javascript this arrow-functions

(我从Stack Overflow获悉,这个问题很可能被否决或标记为重复,但我不建议您这样做,因为我一直在研究Stack Overflow的答案以尝试回答这个问题,找到了说有冲突的帖子,这就是我要解决的问题。

我试图理解箭头函数的绑定(以及它们与对象和类方法的使用之间的关系)。我的理解是,箭头函数是在创建时绑定的,从定义的上下文中提取this。一些帖子说是这样。有些帖子说的恰恰相反,例如箭头Arrow Functions and This就是这样,认为箭头功能根本就没有约束,最受好评的答案是:

  

简短的回答:此代码指向此代码的最接近边界   只要在随附的作用域中可以找到它。

     

更长的答案:箭头函数在绑定时将其绑定   创建的没有此名称,参数或其他特殊名称   完全-创建对象时会在其中找到名称   封闭范围,而不是人员对象。

我创建了一个小的Codepen示例来测试哪个正确,并且我相信确实在创建时箭头函数是永久绑定的:如果将箭头函数分配给对象的属性,则调用该函数在另一个对象的上下文中,它仍然保持创建时的this

是哪个?箭头函数是在创建时永久绑定到创建它们的上下文的this,还是根本没有绑定?

如果它们在创建时确实绑定了,那是因为您可以在ES6类中使用箭头函数作为方法的原因吗?也就是说在这种情况下

class MyClass {

    constructor() {
    this.myVariable = 0;
    console.log("in constructor this is",this)
        this.myMethod = () => {
            console.log("in myMethod this is",this)

            this.myVariable++;
        };
    }

箭头函数myMethod只是绑定到构造函数已定义为要创建的实例的上下文的this上吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

实际上,两者都说相同,而“ this位于封闭范围内”在技术上可能更正确。这里重要的是,“作用域”是由词法确定的,因此调用函数的方式和位置都无关紧要,而是声明了该函数:

const a = () => this; // global scope

function b() {
  const c = () => this; // function scope of b
}

可以说作用域在声明时绑定到一个函数,并且由于作用域还包含上下文(this),因此上下文(this)也被绑定。

>

如果我们想象this是一个常规变量,也许整个概念会变得更加清晰:

const this = window;

const a = () => this; // global scope, "this" is window

function b(this) { // context determined on call
  const c = () => this; // scope of the b function
}