SetInterval结合if条件的数组赋值问题:如何在条件不满足时保留首次生成的数组
解决setInterval中数组变量无法保留的问题
嘿,这个问题我之前也碰到过!核心原因是变量作用域和var的特性在搞鬼。
你看,你把ta用var声明在了if块的内部,虽然var是函数级作用域,但每次setInterval的回调函数执行时,var ta会被提升到回调的顶部——但只有当a==1的条件满足时,ta才会被赋值成数组并填充内容。当条件不满足的时候,ta只是被声明了,但根本没被赋值,所以自然就显示undefined了。
要解决这个问题很简单,只需要把ta的声明移到setInterval的外面,让它处于外层作用域里,这样每次回调执行时都能访问到同一个ta变量:
var a = 1; var ta = []; // 把ta的声明移到定时器外面,初始化空数组 setInterval(() => { if (a == 1) { // 这里直接修改ta,不用重新声明 ta = []; for(let i = 1; i < 3; i++){ ta.push(i); }; console.log(ta); console.log("ta"); a = 2; } console.log(ta); // 现在不管条件满足与否,都能拿到之前的数组内容 }, 5000);
另外,我还推荐你用let代替var来声明变量,let是块级作用域,能避免很多var带来的变量提升坑,代码会更安全:
let a = 1; let ta = []; setInterval(() => { if (a === 1) { // 这里用全等===更好,避免不必要的类型转换 ta = []; for(let i = 1; i < 3; i++){ ta.push(i); }; console.log(ta); console.log("ta"); a = 2; } console.log(ta); }, 5000);
这样修改后,第一次条件满足时会生成并填充数组,之后条件不满足时,ta会一直保留第一次生成的内容,再也不会出现undefined的情况啦~
内容的提问来源于stack exchange,提问作者Nima Azii
相关产品推荐
相关产品推荐

