(我从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
上吗?
感谢您的帮助!
答案 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
}