我有一個註冊事件處理程序的建構子:
function MyConstructor(data, transport) { this.data = data; transport.on('data', function () { alert(this.data); }); } // Mock transport object var transport = { on: function(event, callback) { setTimeout(callback, 1000); } }; // called as var obj = new MyConstructor('foo', transport);
但是,我無法存取回呼內建立的物件的 data
屬性。看起來 this
不會引用創建的對象,而是引用另一個對象。
我還嘗試使用物件方法而不是匿名函數:
function MyConstructor(data, transport) { this.data = data; transport.on('data', this.alert); } MyConstructor.prototype.alert = function() { alert(this.name); };
但它也存在同樣的問題。
如何存取正確的物件?
以下是在子上下文中存取父上下文的幾種方法 - H2>- 您可以使用
- 將對 context/this 的引用儲存在另一個變數中(請參閱下面的範例)。
- 使用 ES6 箭頭 功能。
- 更改程式碼、功能設計和架構 - 為此,您應該掌握設計模式 a> 在 JavaScript 中。
綁定 a>()
函數。1.使用
bind()
函數如果您使用的是 Underscore.js - http://underscorejs.org/#bind
2.將對 context/this 的引用儲存在另一個變數中
3.箭頭函數
關於
此內容您應該了解
this
(又稱「上下文」)是每個函數內的特殊關鍵字,其值只取決於如何呼叫函數,而不是如何/何時/何處調用它被定義了。它不像其他變數一樣受到詞法作用域的影響(箭頭函數除外,見下文)。以下是一些範例:要了解有關
此
的更多信息,請查看MDN 文件。如何引用正確的
this
#使用箭頭函數
#ECMAScript 6 引入了箭頭函數,可以將其視為 lambda 函數。它們沒有自己的
this
綁定。相反,this
就像普通變數一樣在範圍內尋找。這意味著您不必呼叫.bind
。這並不是他們唯一的特殊行為,請參閱 MDN 文件以獲取更多資訊。不要使用
這個
#您實際上不想特別訪問
this
,而是訪問它引用的物件。這就是為什麼一個簡單的解決方案是簡單地建立一個也引用該物件的新變數。變數可以有任何名稱,但常見的是self
和that
。由於
self
是一個普通變量,因此它遵循詞法範圍規則並且可以在回調內部存取。這還有一個優點,就是您可以存取回呼本身的this
值。明確設定回呼的
this
- 第 1 部分看起來您無法控制
this
的值,因為它的值是自動設定的,但實際上並非如此。每個函數都有方法
.bind
[docs],它會傳回一個新函數,其中this
綁定到一個值。函數與您呼叫.bind
的函數具有完全相同的行為,只是this
是由您設定的。無論何時或如何呼叫該函數,this
都將始終引用傳遞的值。