[英]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.