下面是代碼,我覺得閉合功能有一個怪異的行爲一個小片段...JavaScript的關閉不正確的行爲
var arr = [5, 6, 7, 8, 9, 0];
var someFn;
arr.forEach(function(val, idx) {
if (!someFn) {
someFn = function() {
console.log(`B: ${idx} : ${val}`);
};
}
console.log(`A: ${idx} : ${val}`);
someFn();
});
最終控制檯輸出...
A: 0 : 5 B: 0 : 5 A: 1 : 6 B: 0 : 5 A: 2 : 7 B: 0 : 5 A: 3 : 8 B: 0 : 5 A: 4 : 9 B: 0 : 5 A: 5 : 0 B: 0 : 5
我希望someFn
當在foreach是處理,但它總是輸出第一個值是"idx: 0, val: 5"
處理的遞增值。
我不認爲這是正確的行爲,因爲someFn
正在創建一個閉包,它包含變量idx
和val
,並且這兩個變量都在外層函數中發生變化。
感激,如果有人可以慈祥解釋這種行爲。
我想這是因爲你宣佈'someFn( )'帶有'idx'和'val'的當前值,一旦你繼續調用它,你就不會傳遞它們的新值。 – Lixus
如果你的條件搞砸了,請使用: var arr = [5,6,7,8,9,0]; var someFn; arr.forEach(功能(VAL,IDX){ someFn =函數(){ 的console.log('B:$ {IDX}:$ {VAL}'); }; someFn(); }); 它會工作。 –
@baao該問題與** template literals **無關。所以我投票重新打開這個。 –