zoukankan      html  css  js  c++  java
  • 闭包。for循环内定时器无效问题解决

    js闭包及问题的解决

     
    • 闭包定义,作用

        闭包就是能够读取其他函数内部变量的函数。

        作用:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中

        缺点:闭包会保存函数中的变量在内存中,导致内存消耗大

               闭包会在父函数外部改变父函数内部变量的值

    • 闭包与异步执行函数

       前端使用异步执行的情况有

        a  定时任务:setTimeOut() setInterval()

        b  网络请求:ajax请求 动态<img>加载

        c  时间绑定

      当遇到异步的情况时,函数的输出结果:

        for(var i = 1; i <= 5;i++){

          setTimeout(function timer(){

            console.log( i );

          },i * 1000);

        } //输出结果是6 6 6 6 6 6

      因为,当执行setTimeOut()时,会暂时跳过这一段,放在缓冲区,当for循环执行结束之后,由于i是全局变量,此时在执行console.log( i )就会是 6,而不是预期中的0 1 2 3 4 5,解决办法通常有两种一是使用ES6中let使for循环中的变量变成块儿作用域,二就是使用立即执行函数,通过函数作用域可以保存变量的特性来将每次循环的变量 i 保存到函数中。

      使用let:

        for( let i = 0; i <= 5; i++){

          setTimeout( function timer(){

            console.log( i );

          },i * 1000);

        }// 输出结果 0 1 2 3 4 5

      使用立即执行函数(IIFE):

        for(var i = 0; i <= 5; i++){

          (function(){

            var j = i;

            setTimeout( function timer(){

              console.log( j );

            }, j * 1000);

          })();

        }//输出结果0 1 2 3 4 5

  • 相关阅读:
    轻量级数据库sqlite的使用
    Integer引发的思考
    css限制显示行数
    数据库 chapter 17 数据仓库与联机分析处理技术
    数据库 chapter 15 对象关系数据库系统
    数据库 chapter 16 XML数据库
    数据库 chapter 14 分布式数据库系统
    数据库 chapter 11 并发控制
    数据库 chapter 12 数据库管理系统
    数据库 chapter 13 数据库技术新发展
  • 原文地址:https://www.cnblogs.com/zypblogs/p/13177042.html
Copyright © 2011-2022 走看看