[英]Accessing 'this' variable in function passed to setInterval/setTimeout
[英]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.