javascript - setInterval中的变量问题?这是闭包问题么?
迷茫
迷茫 2017-04-11 09:05:01
[JavaScript讨论组]
    var goTop=function (){
            let i=0;
            i++;            
            console.log(i);    
    }

        setInterval(goTop,1000);

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

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(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);
PHP中文网
    var goTop=function (){
            let i=0;
            return function (){
                i++;            
                console.log(i); 
            }   
    }()

    setInterval(goTop,1000);
迷茫

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

高洛峰

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号