美文网首页
作用域—for循环打印结果问题

作用域—for循环打印结果问题

作者: 攻城狮_前端程序媛 | 来源:发表于2021-06-23 23:11 被阅读0次
 for(var i = 0; i < 4; i++){
    setTimeout(() => {
         console.log(i)
    }, 0)
  }
//打印结果为4次4

原因:

  1. var不支持块级作用域,此处var i声明变量是全局变量
  2. setTimeout是异步任务中的宏任务,每次for循环都会放到宏任务队列中等待时机执行
  3. 同步代码for循环执行完,此时变量 i =4;
  4. 再执行每个宏任务timeout打印结果均为4

下面是正常打印0,1,2,3的常用解决方式

//方式一
for(let i = 0; i < 4; i++){
    setTimeout(() => {
         console.log(i)
    }, 0)
  }
//打印结果:0,1,2,3
// 原理: let支持块级作用域,timeout执行时取值是先从当前作用域查找
//方式二
for(var i = 0; i < 4; i++){
    setTimeout((i) => {
      console.log(i)
    }, 0, i)
}
//打印结果:0,1,2,3
//原理: setTimeout,支持给需要执行的函数传参,
详见MDN https://developer.mozilla.org/zh-CN/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout
//方式三
 for (var i = 0; i < 4; i++) {
   (function (i) {
      setTimeout(() => {
        console.log(i)
      }, 0)
    })(i)
}
//打印结果:0,1,2,3
//原理: 立即执行函数,形成函数作用域

相关文章

  • 作用域—for循环打印结果问题

    原因: var不支持块级作用域,此处var i声明变量是全局变量 setTimeout是异步任务中的宏任务,每次f...

  • (二)11.函数扩展19-08-08

    参数默认值 打印结果:默认值 hello world默认值 hello kill 作用域概念 打印结果:作用域 k...

  • JS函数执行时机

    请问下面这段代码会打印什么结果 打印出6 个6解析:因为i作用域,不属于 for 循环体,属于 global;等到...

  • 请写出如下代码的打印结果

    问题 请写出如下代码的打印结果 or 答案 第一个 1、首先在进入函数作用域当中,获取name属性2、在当前作用域...

  • js 中的 for 循环

    特点 一 for循环设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。 执行结果

  • 【新手向】ES6常见概念初体验

    一、var和let命令 作用域  ES5的作用域只有全局作用域和函数作用域,这会带来很多问题,比如常用的for循环...

  • JavaScript函数定义和执行的一些理解--词法作用域(静态

    1、词法作用域(静态作用域)和动态作用域 先看个栗子: 例子1 结果输出打印出来的是:1 那接下来的就是知识点了:...

  • js笔记

    1. 关于循环 for( A ) { B };for循环的A和B是两个不同的作用域,B作用域是A作用域的子域,如下...

  • let 与 var 的异同

    遇到过的一个问题 请写出下图输出结果 图中第一问因为在let作用域的问题,在for循环中声明,循环之外销毁 所以 ...

  • for循环语法

    for循环作用域解析: 设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。for (let i...

网友评论

      本文标题:作用域—for循环打印结果问题

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