簡體   English   中英

Javascript箭頭功能是在創建時永久綁定還是根本沒有綁定:對象和類方法的情況

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM