闭包

2019-09-28  本文已影响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 是相互独立的,各自返回自己的私有变量。
上一篇下一篇

猜你喜欢

热点阅读