经典闭包:
let arr = ['a','b','c'];
for(var i = 0; i < arr.length; i ++){
setTimeout(() => {
console.log(i); //闭包!i == 3
}, 2000);
}
forEach没有形成闭包:
let arr = ['a','b','c'];
// 没有形成闭包
arr.forEach((item, index) => {
setTimeout(() => {
console.log(item); // a b c
}, 1000);
})
forEach内引用的外部值,形成闭包:
let arr = ['a','b','c'];
var num = 0;
arr.forEach((item, index) => {
num = index;
setTimeout(() => {
console.log(num); //2 闭包
console.log(item) // a b c
}, 3000);
})
思考:
闭包是对外部变量的引用,forEach的处理函数内的item、index每次都是重新定义和生成的,
对数组forEach方法的深入理解:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach