在箭头函数中绑定“this”的难题:揭开困境
尽管箭头函数具有诱人的简单性,但它们关于 '这让很多开发者感到困惑。无法将“this”绑定到箭头函数中的特定上下文已成为反复出现的挫败感来源。
为了说明这一困境,请考虑以下代码:
const f = () => console.log(this); const o = { a: 42 }; const fBound = f.bind(o); fBound(); // Expected: { a: 42 }, Actual: { window: Window }
在此示例中,我们尝试使用“bind()”方法将箭头函数“f”的“this”上下文绑定到对象“o”。然而,调用“fBound()”会莫名其妙地记录全局“window”对象,而不是预期的“o”对象。
这种令人困惑的行为根源于箭头函数的固有性质。与具有自己的“this”上下文的常规函数不同,箭头函数从周围的词法范围继承其“this”绑定。在本例中,“f”是在全局范围内定义的,将“this”呈现为绑定到全局“window”对象。
ECMAScript 2015 规范明确指出:
“任何引用ArrowFunction 中的参数、super、this 或 new.target 必须解析为词法封闭的绑定环境。”
因此,在箭头函数中重新绑定“this”是不可能的。 “this”将永远锚定在定义箭头函数的上下文中。
如果“this”的有意义使用对您的代码至关重要,那么谨慎的做法在于使用常规函数而不是使用常规函数箭头函数。常规函数可以更好地控制“this”绑定,使您能够使用“bind()”或其他方法将“this”显式绑定到所需的上下文。
以上是为什么'bind()”不能与箭头函数'this”一起使用?的详细内容。更多信息请关注PHP中文网其他相关文章!