首頁  >  文章  >  web前端  >  非同步使用 setTimeout 時如何保留 JavaScript 中「this」的上下文?

非同步使用 setTimeout 時如何保留 JavaScript 中「this」的上下文?

Patricia Arquette
Patricia Arquette原創
2024-10-24 18:25:19913瀏覽

How to Preserve the Context of

setTimeout 和JavaScript 中難以捉摸的「this」

在JavaScript 中使用setTimeout 函數時,遇到的一個常見問題是「 this”關鍵字。當包含 setTimeout 呼叫的方法引用另一個方法,但在逾時期限之後,引用的方法變得未定義時,就會發生這種情況。

此問題源自於 setTimeout 的操作方式。當函數作為參數傳遞給 setTimeout 時,該函數內「this」的上下文就會遺失。這是因為 setTimeout 會非同步執行該函數,到那時,「this」的原始上下文可能無法再存取。

要解決這個問題,有兩種常見的解決方案:

1.使用bind()方法

bind()方法可用於在傳遞給setTimeout的函數中保留「this」的上下文。透過將「.bind(this)」附加到函數末尾,可以明確保留上下文,如下例所示:

setTimeout(function() {
    this.foo();
}.bind(this), 1000);

2.箭頭函數

箭頭函數自動將「this」綁定到周圍的上下文。因此,不需要額外的步驟來維護傳遞給setTimeout 的回呼函數中的正確上下文:

setTimeout(() => {
    this.foo();
}, 1000);

將這些技術應用於提供的程式碼片段,可以透過修改程式碼來解決問題,如下所示:

test.prototype.method = function() {
    //method2 returns image based on the id passed
    this.method2('useSomeElement').src = "http://www.some.url";
    timeDelay = window.setTimeout(this.method.bind(this), 5000);
    //                                       ^^^^^^^^^^^ <- fix context
};

以上是非同步使用 setTimeout 時如何保留 JavaScript 中「this」的上下文?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn