【问题标题】:Are Javascript arrow-functions bound permanently at creation or not bound at all: the case of object and class methodsJavascript箭头函数是在创建时永久绑定还是根本不绑定:对象和类方法的情况
【发布时间】:2018-07-21 17:02:23
【问题描述】:

(Stack Overflow 通知我,这个问题可能会被否决或标记为重复,但我希望您不要这样做,因为我一直在仔细研究 Stack Overflow 的答案以尝试回答它,并且发现帖子中的内容相互矛盾,这是我正在尝试解决的问题)。

我试图了解箭头函数的绑定(以及这与它们作为对象和类方法的使用有何关系)。我的理解是,箭头函数在创建时就绑定了,从定义它的上下文中获取this。有些帖子说是这样。有些帖子则相反,认为箭头函数根本不受约束,例如这篇帖子 Arrow Functions and This ,其中投票率最高的答案是:

简答:this 指向最近的边界 this - 在代码中 只要在封闭范围内找到它。

更长的答案:箭头函数绑定它们的 this 时 created 没有绑定 this、arguments 或其他特殊名称 根本 - 当对象被创建时,它所在的名称 封闭范围,而不是 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,构造函数已将其定义为正在创建的实例的上下文?

感谢您的帮助!

【问题讨论】:

标签: javascript this arrow-functions


【解决方案1】:

实际上两者都说相同,而“this is found in the enclosure scope”在技术上可能更正确。这里重要的是“范围”是由词法确定的,所以无论你如何以及在何处调用函数并不重要,而是它是否被声明:

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
}

【讨论】:

  • 谢谢。但这意味着“封闭范围”在创建箭头函数时,而不是在使用时?这让我很困惑。
  • @cerulean 是的,范围是根据词法确定的。
  • 因此,从您的示例继续,如果要在对象的上下文中使用函数 a -- const a = () => this; const obj = { fun: a }; console.log(obj.fun());,结果仍然是全局范围?
  • @cerulean 是的,完全正确。
猜你喜欢
  • 2018-11-10
  • 2016-08-21
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2017-02-17
相关资源
最近更新 更多