1.无闭包

  1. var x = [];
  2. for (var i = 0; i < 9; i++) {
  3. setTimeout(function () {
  4. x[i] = i
  5. }, 1000)
  6. }
  7. console.log(i);
  8. console.log(x);

image.png

2.闭包

var y = [];
function doSetTimeout(i) {
    setTimeout(function () {
        y[i] = i;
    }, 1000);
}
for (var i = 0; i < 9; i++) {
    doSetTimeout(i);
}
console.log(i);
console.log(y);

image.png

3.闭包和自调用函数结合

var z = [];
for (var i = 0; i < 9; i++) {
    (function (i) {
        setTimeout(function () {
            z[i] = i;
        }, 1000)
    })(i);
}
console.log(z);

image.png

4.闭包和自调用函数结合

var z = [];
for (var i = 0; i < 9; i++) {
    (function () {
        setTimeout(function () {
            z[i] = i;
        }, 1000)
    })();
}
console.log(z);

image.png

5.闭包和自调用函数结合

var z = [];
for (var i = 0; i < 9; i++) {
    (function () {
        var j = i
        setTimeout(function () {
            z[j] = j;
        }, 1000)
    })();
}
console.log(z);

image.png