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