js 闭包的用法详解

一、闭包

实现可重用的局部变量,且保护其不受污染的机制。

  1. 外层函数包裹受保护的变量和内层函数。
  2. 内层函数专门负责操作外层函数的局部变量。
  3. 将内层函数返回到外层函数外部,反复调用。

二、作用域

子函数会一级一级地向上寻找所有父函数的变量。所以,父函数的所有变量,对子函数都是可见的,反之则不成立。

三、函数调用

  1. 外层函数调用了几次,就有几个受保护的局部变量副本。
  2. 同一次外层函数调用返回的多个内层函数,共同用一个局部变量。
  3. 闭包的局部变量不能释放。
  4. 尽量不要在定时器中使用闭包。因为闭包的外层函数定义的变量不能释放,但是定时器使用中需要释放。

四、内层函数使用不同变量的实例详解

1、内层函数使用自己的变量

内层函数使用自己的变量,调用完后,直接释放。

function outerFun(){
    function innerFun(){
        var innerVar = 0;
          innerVar++;
        alert(innerVar);
    }
    return innerFun;
}
var globVar1 = outerFun();
globVar1();        // Alert 1
globVar1();        // Alert 1
var innerVar2 = outerFun();
innerVar2();    // Alert 1
innerVar2();    // Alert 1

2、内层函数使用全局变量

全局变量释放,是在所有代码运行完成后。

var globVar = 0;
function outerFun(){
    function innerFun(){
        globVar++;
        alert(globVar);
    }
    return innerFun;
}
var globVar1 = outerFun();
globVar1();  // Alert 1
globVar1();  // Alert 2
var globVar2 = outerFun();
globVar2();  // Alert 3
globVar2();  // Alert 4

3、内层函数使用外层函数变量(闭包)

  • 外层函数调用几次就有几个被保护的局部变量副本。
  • 闭包的局部变量不被释放。
function outerFun(){
    var outerVar = 0;
        function innerFun(){
        outerVar++;
        alert(outerVar);
     }
    return innerFun;
}
var globVar = outerFun();
globVar();  // Alert 1
globVar();  // Alert 2
var globVar2 = outerFun();
globVar2();  // Alert 1
globVar2();  // Alert 2
原文地址:https://www.cnblogs.com/minigrasshopper/p/8056441.html