JS深入之闭包

February 12, 2022

什么是闭包


闭包是指那些能访问自由变量(在函数中使用的既不是函数局部的变量,又不是函数参数的变量)的函数

闭包 = 函数 + 自由变量

ECMAScript中,闭包指的是:

从理论角度:所有的函数。因为它们都在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域。 从实践角度:以下函数才算是闭包:

  • 即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)
  • 在代码中引用了自由变量

    在MDN的解释中,闭包是一个函数以及其捆绑的周边环境状态的引用的组合。闭包让开发者可以从内部函数访问外部函数的作用域

代码示例


  function init() {
    const name = 'chinley';
    function displayName() {
      alert(name);
    }
    displayName();
  }
  init();

init创建了一个局部变量name和一个名为displayName的函数。displayName是定义在init里的内部函数,并且仅在init函数体内可用。displayName没有自己的局部变量,但它可以访问到外部函数的变量, 所以displayName可以使用init中声明的变量name。

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}

var foo = checkscope();
foo();

f函数执行的时候,尽管checkscope的执行上下文已经从执行上下文栈中弹出,checkscopeContext被销毁了,但f函数的执行上下文维护的作用域还是记录了checkscope的活动变量 fStack = [VO, checkscopeContext.VO, globalContext.VO]

function addNum(x) {
  return (y) => x+y;
}

const add5 = addNum(5);
add5(10); // 15

闭包的作用

  • 用闭包模拟私有方法
  • 可以读取到函数内部的变量
  • 让变量始终保存在内存中
相关阅读

「学习Javascript闭包(Closure)」- 阮一峰


Profile picture

百事可乐

Let it snow, let it snow, let it snow