• js闭包


    js闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等。

    在Javascript中闭包(Closure),有两个特点:作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态;一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

    所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

    来看一个错误的js闭包的介绍:
    function f(){
      var a =[];
      var i;
      for(i=0;i<3;i++){
        a[i] = function(){
          alert(i);
          return i;
        }
      }
      return a;
    }
     
    var a = f();
    a[0]();//3
    a[1]();//3
    a[2]();//3
     
    知道为什么是错误的吗?
    照常理来说我们理想的值应该是0,1,2;但是却不是的,为什么呢?其实我们在循环的过程中忘记做一件事,那就是去保留原来在数组a[i]的值,它没有保留原来的值,而是把原来的值拿去循环了,所以循环后的最终结果就是a[i]要输出的最终结果,那我们要怎么正确的去写呢?来看代码:
     
    function f() {
      var a = [];
      var i;
      for(i = 0; i < 3; i++) {
        a[i] = (function(x){
          return function(){
            alert(x);
            return x;
          }
        })(i);
      }
      return a;
    }
    var a = f();
    a[0]();//0
    a[1]();//1
    a[2]();//2
     
    想知道为什么对了吗?我们可以看到,这串代码和刚才的代码我们多添加一个输出的方法,那是该闭包最后执行的作用域,我们把循环的结果都保存到(return function(){
    alert(x);
    return x;
    })里面去这样一来我们的想要输出i的值就可以通过该闭包去输出,x是干什么的很多初学js的人不知道,没关系,x其实是我想代替i去执行的局部变量,明白了吧,是不是很简单啊,你们有没有发现父作用域和原来的不一样了,其实不是的,我只是在输出之前让i执行了一个自调用函数,不懂自调用函数的可以到时候问我,或者到官方js论坛去看;如果不明白上面的不要紧,我们来写个更简单的吧!!!看好了哦
     
    function f() {
      function makeClosure(x) {
        return function(){
          return x;
          alert(x);
        }
      }
      var a = [];
      var i;
      for(i = 0; i < 3; i++) {
        a[i] = makeClosure(i);
      }
      return a;
    }
  • 相关阅读:
    MySQLSource-Flume
    Flume
    Hive| ETL清洗& 查询练习
    Hive-04 压缩| 存储
    Hive-03 查询
    Hive-02 DDL| DML
    shell基本用法
    Hive-01 配置| 架构原理
    HDFS-HA高可用 | Yarn-HA
    react-路由和Ant design
  • 原文地址:https://www.cnblogs.com/shirandedan/p/5384298.html
Copyright © 2020-2023  润新知