闭包

作者: 苹果咏 | 来源:发表于2019-09-28 20:36 被阅读0次

函数和函数内部能访问到的变量的总和,就是一个闭包。
特点:
1、能让外部访问函数内部的变量
2、避免使用全局变量,防止全局变量污染
3、局部变量会常驻内存中,会造成内存泄漏

function test(){
  var i=10;
  return function leijai(){
    i++;
    return i;
  }
}
var a=test()   //此时a就是里面的leijia函数
a()    //11
a()  //12
a()  //13

i声明在test函数内部,所以test内部的laijia函数也能访问此变量,a是执行test函数,返回的是test函数里的leijia函数


image.png

因为JS的回收机制,自动回收不再使用的内存空间,但是闭包会阻止某些回收,因为leijia函数依然持有其所在作用域的引用,所以其内部作用域不会被回收
a()才是执行leijia函数

var arr=[]
undefined
for(var i=0;i<3;i++){
    arr[i]=function(){
        console.log(i)
    }
}
arr[0]()//3
arr[1]()//3
arr[2]()//3

函数不调用是不会执行的,这里arr[i]只会执行最后i=3的结果

var arr = []
    for (var i = 0; i < 3; i++) {
        console.log('i的值是:' + i)
        arr[i] = (function (i) {
            return function(){
                console.log(i)
            }  
        })(i)
    }
    arr[0]()//0
    arr[1]()//1
    arr[2]()//2

加了立即执行函数,不调用的话输出:


image.png

调用后:


image.png
闭包的用途:

1.从外部读取函数内部的变量。

function f1() {
  var n = 9;
  function f2() {
    console.log(n);
  }
  return f2;
} 
var result = f1();
result(); // 9
//这段代码中,函数f1的返回值就是函数f2,由于f2可以读取f1的内部变量,所以就可以在外部获得f1的内部变量了。

2.让这些变量始终保持在内存中。

function f1(n) {
  return function () {
    return n++;
  };
}
var a1 = f1(1);
a1() // 1
a1() // 2
a1() // 3
//这段代码中,闭包使得内部变量记住上一次调用时的运算结果。

3.封装对象的私有属性和私有方法。

function f1(n) {
  return function () {
    return n++;
  };
}
var a1 = f1(1);
a1() // 1
a1() // 2
a1() // 3
var a2 = f1(5);
a2() // 5
a2() // 6
a2() // 7
//这段代码中,a1 和 a2 是相互独立的,各自返回自己的私有变量。

相关文章

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • 闭包,闭包,闭包

    1、这家伙到底是什么? 网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变...

  • 闭包-Closures [swift 5.1]

    闭包的语法 尾随闭包 闭包逃离 自动闭包

  • Day7 闭包(Closures)

    本页包含内容:• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包 1、闭包表达式 闭包...

  • Python闭包

    闭包 = 环境变量 + 函数 调用闭包内部的环境变量 闭包的经典误区 闭包与非闭包实现人类走路 非闭包 闭包

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • swift- 闭包一

    /*• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包*/

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • Swift-进阶 :闭包(二)逃逸闭包 & 非逃逸闭包

    本文主要分析逃逸闭包 、非逃逸闭包、自动闭包 逃逸闭包 & 非逃逸闭包 逃逸闭包定义 当闭包作为一个实际参数传递给...

  • javascript闭包详解

    跟我念 bi 闭 bao包 ,闭包的闭,闭包的包。。 闭包的简介 在计算机科学中,闭包(英语:Closure),又...

网友评论

      本文标题:闭包

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