繁体   English   中英

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

[英]Are Javascript arrow-functions bound permanently at creation or not bound at all: the case of object and class methods

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

我正在尝试理解箭头函数的绑定(以及与它们用作对象和类方法的关系)。 我的理解是,一个箭头功能在创作的时刻约束,采取this从定义它的上下文。 一些帖子说是这样。 一些帖子说的恰恰相反,坚持认为箭头函数根本没有绑定,例如这篇文章Arrow Functions and This ,其中投票率最高的答案是:

简短的答案:这指向最接近的边界-在随附的范围内找到的代码中。

更长的答案:箭头函数在创建时绑定了此对象,而根本没有绑定此参数,参数或其他特殊名称-创建对象时,该名称在封闭范围内找到,而不是在person对象中。

我创建了一个小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上?

谢谢你的帮助!

实际上,这两个说的一样,而“ 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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM