使用 ES6 在函數中合併屬性時,嘗試存取 this 物件時會出現問題。
var person = { name: "jason", shout: () => console.log("my name is ", this.name) } person.shout() // Should print out my name is jason
但是,執行此程式碼無法包含預期的名稱,僅列印「我的名字是」。這個問題源自於箭頭函數的獨特行為。
箭頭函數缺少綁定 this、參數或其他特殊名稱。建立物件時, this 位於封閉範圍內,而不是在物件內。透過檢查這些變體中的程式碼,問題變得更加明顯:
var person = { name: "Jason" }; person.shout = () => console.log("Hi, my name is", this);
並且,當轉換為ES5 中箭頭語法的模糊近似時:
var person = { name: "Jason" }; var shout = function() { console.log("Hi, my name is", this.name); }.bind(this); person.shout = shout;
在這兩種情況下,shout 函數的this 指向定義person的作用域,而不是添加到該物件時與該物件關聯的新作用域person.
雖然箭頭函數無法複製預期的行為,但ES6 提供了一種替代解決方案,利用方法聲明模式來節省空間:
var person = { name: "Jason", // ES6 "method" declaration - leaving off the ":" and the "function" shout() { console.log("Hi, my name is", this.name); } };
以上是為什麼 ES6 箭頭函數中的 `this` 不能如預期般運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!