鍍金池/ 問答/HTML/ js閉包 返回函數(shù)中的循環(huán)變量的問題

js閉包 返回函數(shù)中的循環(huán)變量的問題

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push(function () {
            console.log(i)
            return i * i;
        });
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
console.log(f1(),f2(),f3()) //4 4 4 16

最近在看廖雪峰的 js 教程,看到這里有點疑惑,為什么到最后面 i=4 呢?循環(huán)語句中條件寫出了 i<=3 的啊。希望有大神給我點指點。

回答
編輯回答
魚梓

i <= 3 是讓 for 循環(huán)停止,但是此時 i 的值就是 4。

剩下的就是閉包的作用域問題了。

2017年11月1日 13:05
編輯回答
忘了我

for循環(huán)是判斷后置的。你可以簡單理解為:
第一次:i=1,i<=3,條件成立,循環(huán)繼續(xù);
第二次:i=1+1=2,i<=3,條件成立,循環(huán)繼續(xù);
第三次:i=2+1=3,i<=3,條件成立,循環(huán)繼續(xù);
第四次:i=3+1=4,i>3,條件不成立,循環(huán)結(jié)束。變量i=4被保存下來,i的值不再改變,不再執(zhí)行循環(huán)體里面的內(nèi)容。

為什么函數(shù)在for循環(huán)體里面,拿到的i卻始終是4呢,那是因為這個函數(shù)根本沒有執(zhí)行,只是聲明了一個匿名函數(shù),所以不會把i當(dāng)時的值保存下來,只是保持對i內(nèi)存位置的引用。要想保存i循環(huán)s的值,可以使用閉包。

2018年3月3日 18:55
編輯回答
互擼娃

i<=3即i=3時會進入之后的循環(huán),i++即執(zhí)行完當(dāng)前循環(huán)為i+1

2018年6月1日 04:36
編輯回答
汐顏

判定是在 for 里面進行的, 當(dāng) i==3這輪循環(huán)完了會給 i++, 再次進行條件判定 所以 i 最后為 4

2018年5月6日 00:32
編輯回答
憶當(dāng)年
function count() {
    var arr = [];
    for (let i=1; i<=3; i++) {
        arr.push(function () {
            console.log(i)
            return i * i;
        });
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
console.log(f1(),f2(),f3()) //1 2 3 1 4 9
2017年2月4日 06:05