簡體   English   中英

傳遞給setInterval的功能范圍

[英]Scope of function passed to setInterval

在setInterval中調用時,我在理解函數作用域時遇到了麻煩。

當我直接在setInterval內部聲明一個匿名函數時,如下所示:

 let lastEventUUID = "some ID"; const interval = setInterval(async function() { console.log("lastEventUUID -> " + lastEventUUID); lastEventUUID = "another ID"; }, 1000); 

一切正常,我得到了

lastEventUUID -> some ID
lastEventUUID -> another ID
...

但是當我分別聲明我的功能時

 async function myFunc(lastEventUUID) { console.log("lastEventUUID -> " + lastEventUUID); lastEventUUID = "another ID"; } 

並在setInterval調用set:

let lastEventUUID = "some ID";
const interval = setInterval(myFunc, 1000, lastEventUUID);

我在下一次通話中未更新lastEventUUID

lastEventUUID -> some ID
lastEventUUID -> some ID
...

我在這里想念什么?

與是否單獨定義函數無關。 在第一個示例中,您使用的是函數關閉的lastEventID變量。 在第二個示例中,您正在使用傳遞給該函數的lastEventID 參數 由於setInterval每次都傳遞相同的內容,因此您每次都會看到相同的內容。

如果您進行按贊,則可以單獨定義它:

 async function myFunc() { // ^----- No parameter declared console.log("lastEventUUID -> " + lastEventUUID); lastEventUUID = "another ID"; } let lastEventUUID = "some ID"; const interval = setInterval(myFunc, 1000); // No argument given to pass to myFunc --^ 


旁注:您已將函數定義為async函數 如果您的實際函數在函數主體中使用await ,請確保對函數的整個主體進行了一次try / catch並處理了所有錯誤; 否則,錯誤將導致“未處理的拒絕”錯誤(因為計時器機制對函數返回的諾言不做任何事情,包括處理拒絕)。 如果您的實函數不使用await ,則沒有理由使其async


發表您的評論:

據我了解這項工作是因為lastEventUUID是在全局范圍內聲明的,但就我而言,它是在另一個函數中定義的...

不,它不起作用,因為它是全球性的。 之所以起作用,是因為在函數定義的作用域或父作用域中聲明了它。 如果那是一個函數的范圍,它就可以正常工作。 例:

 function foo() { async function myFunc() { console.log("lastEventUUID -> " + lastEventUUID); lastEventUUID = "another ID"; } let lastEventUUID = "some ID"; const interval = setInterval(myFunc, 1000); } foo(); 

全局變量只是該概念的極端情況,稱為閉包 更多: JavaScript閉包如何工作?

實際上,如果我們兩次調用該函數,就會看到每個函數都有一個lastEventID變量(這對於foo定義的東西完全是私有的):

 function foo(x) { async function myFunc() { console.log("x -> " + x + ", lastEventUUID -> " + lastEventUUID); lastEventUUID = "another ID"; } let lastEventUUID = "some ID"; const interval = setInterval(myFunc, 1000); } foo(1); foo(2); 

您還可以使用Closures達到以下目的:

function myFunc(uuid) {
   return function(){
       console.log("lastEventUUID -> " + uuid);
       uuid = "another ID";
     }
}
let lastEventUUID = "some ID";
const interval = setInterval(myFunc(lastEventUUID), 1000);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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