美文网首页
关于js闭包结合定时器的一个题目

关于js闭包结合定时器的一个题目

作者: 7天苹果 | 来源:发表于2017-07-21 09:52 被阅读73次
function fn1(){
    for(var i=0;i<4;i++){
        var tc=setTimeout(function(i){
            console.log(i);
            clearTimeout(tc) 
        },10,i);
    }
}
function fn2(){
    for(var i=0;i<4;i++){
        var tc=setInterval(function(i,tc){
            console.log(i);
            clearInterval(tc)
        },10,i,tc);
    }
}
fn1();     //0,1,2
fn2();     //0,1,2,3,3,3,.......

先看fn1()函数:

我们可以对比之前我们常见的:

function fn1(){
    for(var i=0;i<4;i++){
        var tc=setTimeout(function(i){
            console.log(i);
        },10,i);
    }
}
fn1(); //延迟10ms后输出0,1,2,3 

而在闭包内添加了clearTimeout(tc);之后为什么3没有输出呢?
这是因为tc是在闭包外面的,并没有被保存,保存的只是最后一次循环留下的tc,所有最后一次的tc被清除,只输出了0,1,2

再看第二个fn2()函数:

可以发现区别就是把setTimeout改为了setInterval,同时把定时器也传到了闭包里。那最后一次的定时器为什么没有清除?
这里每次循环先设置定时器,然后把定时器的返回值赋值给tc。在第一次循环的时候tc并没有被赋值,所以是undefined,在第二次循环的时候,定时器其实清理的是上一个循环的定时器。如果调试的话就会发现第一次的tc为undefined,所以导致每次循环都是清理上一次的定时器,而最后一次循环的定时器没被清理,导致一直输出3。

感兴趣可以自己试一试哦~

相关文章

  • 关于js闭包结合定时器的一个题目

    先看fn1()函数: 我们可以对比之前我们常见的: 而在闭包内添加了clearTimeout(tc);之后为什么3...

  • JS闭包大结局(JS闭包系列3)

    在上一篇中再谈JS闭包(JS闭包系列2),我详细的介绍了JS中的变量作用域相关的概念,结合第一节关于JS闭包(JS...

  • 第4天 定时器、闭包、正则表达式

    定时器 https://www.runoob.com/js/js-timing.html 闭包 https://w...

  • 前端(数组,闭包,定时器)

    数组 定时器 定时器弹框 定时器的基本用法 定时器动画 闭包 闭包存循环的索引值 闭包做私有变量计数器 闭包做选项卡

  • 再谈JS闭包(JS闭包系列2)

    这篇文章,来继续谈谈Javascript闭包的剩余问题。因为在上一篇文章中关于JS闭包(JS闭包系列1)主要简单的...

  • JS闭包、定时器

    什么是闭包? 有什么作用闭包:函数对象可以通过作用域链相互关联,函数体内部的变量可以保存在函数的作用域内。 上述代...

  • Js 闭包、定时器

    问题 什么是闭包? 有什么作用 闭包可以用来读取函数内部的变量。 由于作用域链表,外部是无法读取到函数内部的变量的...

  • JS 闭包、定时器

    什么是闭包? 有什么作用## 闭包:简单来说就是通过在父函数中返回内部函数的方法,从外层作用域访问父函数中的变量的...

  • JS闭包、定时器

    1.什么是闭包? 有什么作用 函数的作用域scope取决于声明时,而非调用时。普通函数执行后函数体及内部变量会被垃...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

网友评论

      本文标题:关于js闭包结合定时器的一个题目

      本文链接:https://www.haomeiwen.com/subject/qspskxtx.html