function count() {
var arr = [];
for (var i = 1; i <= 3; i++) {
arr.push(function() { return i * i; });
}
return arr;
}
var results = count();
console.log(results[0](), results[1](), results[2]()); // 全輸出 16
var i 為**函數作用域**,迴圈結束後 i = 4。i 已為 4,故 4*4=16。for (var i = 1; i <= 3; i++) {
arr.push((function(j) {
return function() { return j * j; };
})(i));
}
for (let i = 1; i <= 3; i++) {
arr.push(function() { return i * i; });
}
// let 為區塊作用域,每次迴圈建立新綁定
arr.push(function(j) { return j * j; }.bind(null, i));
`var` 函數作用域 + 閉包捕獲變數引用 是經典陷阱。現代開發請直接使用 let/const 避免此類問題。