我是 javascript 新手,目前正在閱讀有關閉包的資訊。我試圖實作一個例子來更好地理解這個概念。
這是片段:
function getValue() {
let a = 0
const runner = async () => {
a = 1
}
setInterval(runner, 100)
return () => {
return a
}
}
let value = getValue()
console.log(value()) -----> logging statement 1
// some long operation
console.log(value()) -----> logging statement 2
但是,我看到的輸出是:
1
1
我希望這兩個日志陳述句輸出兩個不同的值。我的理解是,一旦getValue()被呼叫,該runner函式將定期執行。該變數a將被更新,因此第二個console.log應該列印一個遞增的值a。
uj5u.com熱心網友回復:
除了錯過主要部分外,您幾乎就在那里。
操作發生得太快了。運行第二次迭代不需要 100 毫秒,因此值保持不變。
嘗試至少等待 100 毫秒,因為您的時間間隔需要增加該時間量。
如下例所示。
function getValue() {
let a = 0
const runner = async () => {
a = 1
}
setInterval(runner, 100)
return () => {
return a
}
}
let value = getValue()
console.log(value())
// operations are happening too fast
setTimeout(() => console.log(value()), 100);
setTimeout(() => console.log(value()), 200);
setTimeout(() => console.log(value()), 300);
uj5u.com熱心網友回復:
function getValue() {
let a = 0
const runner = () => {
a = 1
console.log("Runner's A: " a)
}
setInterval(runner, 100)
return () => {
return a
}
}
let value = getValue()
console.log(value());// -----> logging statement 1
// some long operation
console.log(value());// -----> logging statement 2
https://jsbin.com/geponejuba/edit?js,console,output
如上所述 js 是單執行緒的,因此它的作業方式是,您的日志陳述句首先執行,如果沒有其他事情可做,則執行 setTimeout/setInterval(這是一個非常簡化的陳述句,您可以閱讀詳細版本的“事件回圈”)
在我分享的示例 jsbin 中,您可以看到 setInterval 被呼叫并且確實在更新值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/406952.html
標籤:
