我覺得好像我對閉包的了解差不多了,但我正在努力理解為什么第一個代碼片段記錄 0(是一個陳舊的閉包)但是,第二個代碼片段作業并記錄更新的值 ..
這是某種參考問題嗎?
在第一個例子中,我們不是跟蹤 count 的參考而只將其初始值分配給 message 嗎?
通過在 log 函式中移動 message 變數,我們是否以某種方式告訴 JS 跟蹤計數值的參考?
function createIncrement() {
let count = 0;
function increment() {
count ;
}
let message = count;
function log() {
console.log(message);
}
return [increment, log];
}
const [increment, log] = createIncrement();
increment();
log();
// this will log 0
function createIncrement() {
let count = 0;
function increment() {
count ;
}
function log() {
let message = count;
console.log(message);
}
return [increment, log];
}
const [increment, log] = createIncrement();
increment();
log();
// this will log 1
uj5u.com熱心網友回復:
在第一個例子中,我們不是跟蹤 count 的參考而只將其初始值分配給 message 嗎?
通過在 log 函式中移動 message 變數,我們是否以某種方式告訴 JS 跟蹤計數值的參考?
這就是你正在掙扎的事情。讓我們嘗試分解那里發生的事情。
它的核心是這樣的:
let count = 0;
let message = count;
console.log(message);
count ; // it's exactly the same as count = count 1;
console.log(message); // still prints 0
這與閉包無關,與數字是不可變值有關。當我們遞增時,count我們為變數分配了一個值為 1 的數字的新實體。
message仍然指向舊實體(值,在這種情況下它是相同的),因此日志將列印相同的舊值。
如果我正確理解您的誤解(!),您將其想象成count一個容器,您可以在其中插入一個數值,這有點錯誤。
它是一個指向位于記憶體中某處的數字和不可變值的指標。當你這樣做時,message = count你確保 message 和 count 指向相同的記憶體地址,其中包含0.
當您撰寫 時count ,您正在記憶體中某處為數字 1 分配一個新數字,count現在指向新物件。message不受此操作的影響。這是我認為不是很清楚的關鍵點。
在您的第二個示例中,message每次登錄時都會重新分配,因此它將始終保留對正確值的參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/389470.html
標籤:javascript 关闭
上一篇:reactjs組件中if(x)和if(x==true)的區別
下一篇:如果條件渲染不起作用,則反應多級
