zoukankan      html  css  js  c++  java
  • 关于js的setTimeout执行顺序

    首先定义一个数组 在for循环中使用定时器输出数组

    1 var messages = ['1', '2', '3', '4']; 
    2 for (var i = 0; i < messages.length; i ++) {
    3 setTimeout(function(){
    4 console.log(messages[i]); }, i*1000); 
    5 }

    执行输出的是4个undefined

    为什么不是输出 1  2 3 4 呢 而是输出underfined,这个问题期初以为是作用域的问题,最后百度了,终于找到其原因。

    原因:setTimeout 使函数延迟1s执行,而for循环执行完成还不到0.1秒,到执行函数的时候,其实 i 已经变成4了,而数组下标最大数字是3,没有对应的数组值,所以为underfined。

    解决方法 1

    使用let定义变量I,不要使用var。let 语句声明一个块级作用域的本地变量,并且可选的将其初始化为一个值。

    1 var messages = ['1', '2', '3', '4']; 
    2 for (let i = 0; i < messages.length; i ++) {
    3 setTimeout(function(){
    4 console.log(messages[i]); }, i*1000); 
    5 }

    解决方法2 加个闭包

    1 var messages = ['1', '2', '3', '4'];
    2 for (let i = 0; i < messages.length; i ++) {
    3     (function(i){
    4      setTimeout(function(){
    5      console.log(messages[i]);
    6      }, i*1000);
    7      })(i);//这个的i一定要加进去,去掉函数的参数i,则函数内部没有对i保持引用。
    8      }

    以上两种方式都可以正常输出 1 2 3 4

  • 相关阅读:
    oracle对象之序列
    PLSql工具介绍
    oracle对象之同义词
    oracle对象之视图
    缓存问题汇总
    消息队列问题汇总
    算法-排序算法-1
    redis-主从数据一致
    数据结构与算法-完全二叉树/满二叉树
    写缓冲器与无效化队列
  • 原文地址:https://www.cnblogs.com/wrkjwl/p/8257997.html
Copyright © 2011-2022 走看看