setInterval中的变量问题?这是闭包问题么?

    var goTop=function (){
            let i=0;
            i++;            
            console.log(i);    
    }

        setInterval(goTop,1000);

这段代码为什么一直打印出1,如何让他打印12345,i递增!

阅读 8.8k
6 个回答

**因为你每次调用函数goTop,又let i=0;把i重新声明为0了
要输出1234....只需要把let扔出去**

    let i = 0;
    var goTop = function() {
        i++;
        console.log(i);
    }

    setInterval(goTop, 1000)

顺便下面这个才叫闭包:

闭包的二大要点:
// 1、在函数A外面,调用函数A内的内容——函数B
// 2、函数B可以层层向上调用局部变量n和全局变量m,但是外面的无法获取n

var m = 100;

function A() {
    var n = 50;

    function B() {
        n++;
        var sum = n + m;
        console.log(sum);
    }
    return B; // 此处注意是 B 而不是B(),返回的是函数的内容,而不是执行后的结果
}
var c = A();
c();

这是变量生命周期作用域问题,不是闭包问题,因为你的代码根本没有闭包。但是闭包可以解决你的问题。

使用 let 关键字定义的 i,只在函数中有效,当函数调用完后,i 被收回。1 秒钟之后再次调用函数时,i 又重新被初始化为 0。

通过把 i 定义在函数外可以解决此问题,但是代码有点 low。我们还可以定义一个闭包来解决这个问题。

用闭包的代码如下:

const closure = function () {
    let i = 0;
    return function () {
        i++;
        console.log(i);
    }
};

const goTop = closure();

setInterval(goTop,1000);
let i=0;
var goTop=function (){
    i++;            
    console.log(i);    
}

setInterval(goTop,1000);
    var goTop=function (){
            let i=0;
            return function (){
                i++;            
                console.log(i); 
            }   
    }()

    setInterval(goTop,1000);

let在这里使得变量的作用域变成一个块级作用域。
每次执行后,i都会重新赋值,执行后结果也就是1。
其实这个问题也就是作用域问题

你没发现,每次执行你的函数,就定义一个变量,初值为0,然后自增,那最后打印出来一定是1啦

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题