美文网首页
一段有趣的代码,关于循环内的异步栈以及变量声明

一段有趣的代码,关于循环内的异步栈以及变量声明

作者: ssruoyan | 来源:发表于2018-09-06 00:03 被阅读35次

一段有趣的代码,关于循环内的异步栈以及变量声明

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();
fn2();

fn1 异步栈

循环内会先执行完毕,clearTimeout 中 tc的值永远是最后一个 setTimeout 的 timerId。 因此只是清除了 i = 3 时的定时器。

输出: 0 1 2

fn2 变量定义

先定义tc,再传值。代码可拆分为

var tc;
tc = setInterval(function() {
  console.log(i);
  clearInterval(tc)
}, 10, i, tc)

因此,第一次传入的 tc 值并不是 0 而是 undefined,clearIterval 实际上清除的是上一个定时器,而最后一个定时器永远无法清除。

输出 0 1 2 3 3 3 3 3..........

相关文章

  • 一段有趣的代码,关于循环内的异步栈以及变量声明

    一段有趣的代码,关于循环内的异步栈以及变量声明 fn1 异步栈 循环内会先执行完毕,clearTimeout 中 ...

  • ES6总结

    1.let命令 ①let声明的变量只在它所在的代码块有效。 ②使用let声明变量时for循环设置循环变量的...

  • 循环中的异步请求结果在循环外使用问题

    场景:在一个for循环中执行异步请求,请求结果最终需要在循环外部使用。 由于异步代码执行是在主栈代码执行结束之后再...

  • ES6学习笔记1

    let命令 let命令声明的变量只在所在代码块内生效,适用于for循环中的变量。经典的闭包问题如果用let来作为循...

  • js随笔

    forEach 中不能有异步代码 否则会直接跳过异步, 先执行后续代码在执行循环内的异步代码块查阅资料后发现大概是...

  • 《ES6标准入门》学习笔记 - let、const、var

    let声明的变量只在当前作用域有效,var声明的作用域,在全局范围内都有效 在循环中,let声明的变量,只在循环体...

  • ES6中let和const命令

    let命令用于声明变量,在声明该变量的代码块内有效。不同于var方式声明的变量,var在函数内声明的变量在整个函数...

  • var 和let

    上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改...

  • Go中变量的声明与作用范围

    之前写过这样一段代码: 此for循环不能退出 :=(即var简写)符号可声明新变量,若它出现在某个代码块(使用{}...

  • ES6----let ,var

    let所声明的变量只在代码块内有效,在for循环中使用let,每次都会新声明一个新的变量i 使用var声明变量,则...

网友评论

      本文标题:一段有趣的代码,关于循环内的异步栈以及变量声明

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