for循环中使用let定义变量问题记录
下面四个运行结果初次见到时都颠覆了我的认知,非常不理解,所以在此记录一下。
for (let i = 0, getI = () => i; i < 3; i++) {
console.log(getI());
} // 0,0,0
let i = 0, getI = () => i;
for (; i < 3; i++) {
console.log(getI());
} // 0,1,2
for (
let i = 0,
inc = () => {
i++;
};
i < 3;
inc()
) {
console.log(i);
} // 无限输出0
for (
let i = 0,
get = () => i,
inc = () => {
i++;
};
get() < 3;
inc()
) {
console.log(i);
} // 0 0 0
相关资料: https://es6.ruanyifeng.com/#docs/let
以下仅为个人理解(仅供参考)
1 可以根据上图解释来理解,就是说因为每次循环的i都是一个新的变量,又因为函数getI
中的i是定义时的i,所以函数getI
中的i就是第一个i(i = 0
)
for (let i = 0, getI = () => i; i < 3; i++) {
console.log(getI());
} // 0,0,0
2 同理函数inc
中的i也是第一次定义的i,所以此时的i++并不影响接下来定义的i,也就是说第二次循环定义i时i未变扔是0
for (
let i = 0,
inc = () => {
i++;
};
i < 3;
inc()
) {
console.log(i);
} // 无限输出0
3 同理得函数get
和函数Inc
中的i都是第一次定义时的i也就是同一个i,所以当执行函数inc
时函数get
中的i也会跟着变,但是for循环中的i却并未变一直都为0
for (
let i = 0,
get = () => i,
inc = () => {
i++;
};
get() < 3;
inc()
) {
console.log(i);
} // 0 0 0