zoukankan      html  css  js  c++  java
  • IIFE和闭包和let

    一、立即执行函数

    IIFE(Immediately-Invoked Function Expression),即立即执行函数,或者说匿名立即执行函数。

    早期的时候,也就是ES6还没出来之前,作用域只有函数作用域和全局作用域,但是没有块级作用域。当我们需要快速执行一段代码,代码中有变量的时候,但是又不想污染全局变量,而且又不想以函数的方式调用它的时候,es6之前似乎只有用立即执行函数才可以创建类似块级作用域的作用。

    例子:

    (function (invokeindex){
      console.log(invokeindex)
    })(10)

    输出结果:10

    二、闭包

    闭包其实使用方法就是函数嵌套函数,它能够使全局作用域下间接访问函数内部的变量,也可以避免了全局变量的污染。

    例子:

    function bibao(){
      var a = 10;
      return function(){
        console.log(a)
      }
    }
    var num = bibao()
    num()

    输出:10

    三、let

    let是es6出来的定义,它使js有了块级作用域的概念,它的出现使立即执行函数变得不再必要;

    四、IIFE和闭包和let

    现在提出一个需求,就是生成一系列函数,执行第一个函数输出1,执行第二个函数输出2,用闭包实现

    例子1:

    function createArrFn(){
      var arr = [];
      for(var i = 0 ;i<10;i++){
        arr[i] = function(){
          console.log(i)
        }
      }
      return arr;
    }
    var fnarr=createArrFn()
    for(var j=0;j<10;j++){
      fnarr[j]()
    }

    执行结果:输出10个10;这是因为变量i在执行的时候都是引用同一个变量。

    例子2:使用立即执行函数后

    function createArrFn(){
      var arr = [];
      for(var i = 0 ;i<10;i++){
        (function(ii){
          arr[ii] = function(){
            console.log(ii)
          }
        }(i))//i会传参给ii,此处会立即执行,生成的每一个arr函数的ii变量都是独立的,互不影响
      }
      return arr;
    }
    var fnarr=createArrFn()
    for(var j=0;j<10;j++){
      fnarr[j]()
    }

    运行结果:

     运行结果是自己想要的。

    例子三:使用let

    function createArrFn(){
      var arr = [];
      for(let i = 0 ;i<10;i++){//此处i为块级作用域
        arr[i] = function(){
          console.log(i)
        }
      }
      return arr;
    }
    var fnarr=createArrFn()
    for(var j=0;j<10;j++){
      fnarr[j]()
    }

    执行结果:

     五、总结

    其实IIFE和let在某些情况下的作用一样,它们都可以创建块级作用域,使用它们创建的变量,都会产生一个块级作用域,for循环下产生的变量互不影响,都为重新生成的变量。

    而不会像传统的var定义的变量一样,在for循环下产生的变量都是对同一个变量进行操作。

    穷则独善其身,达则兼济天下……
  • 相关阅读:
    穷举
    菱形
    docker安装cloudera manager,切换cloudera-scm用户报错can not open session
    修改cloudera manager的端口号
    postgresql拓展if、ifnull、group_concat函数
    clion调试postgresql
    Java面向切面原理与实践
    Spring-boot非Mock测试MVC,调试启动tomcat容器
    spring-cloud-feign 使用@RequetParam报错QueryMap parameter must be a Map: class java.lang.String
    linux虚拟机拓展大小
  • 原文地址:https://www.cnblogs.com/hmy-666/p/15138273.html
Copyright © 2011-2022 走看看