精读Javascript系列(五) 函数闭包

前言

本文专门介绍闭包,但事实上,闭包的难点并不在概念,而是在词法环境的嵌套上。只要将词法环境的嵌套关系整理清楚,闭包就瞬间被克服了。

总之,先不废话了,正文开始。

闭包

如果一个函数在定义的词法环境外运行并记住了定义时的词法环境,这样的现象就可以称作函数闭包(Function Closure)
举个简单例子:

    function f(x=0){
   
        var count=x;
        
        function getCount(){
   
            return count++;
        }
        return getCount
    }
    var func = f(10);
    console.log(func());    // 10
    console.log(func());    // 11
    console.log(func());    // 12
    console.log(func());    // 13
    console.log(func());    // 14

首先要明白上面代码究竟发生了什么,梳理一下过程:

  1. 函数f返回了函数getCount的引用, 并将局部变量count设为了10
  2. 外部词法环境中, func指向了getCount

然后在执行func时就很神奇的进行了叠加。
为了直观表示,我就是用图示法表示环境绑定了(也可以用执行上下文伪代码):

在这里插入图片描述

注意: funcgetCount没有在同一个词法环境。

那么执行过程就是:

  1. func引用自getCount所指向的函数。
  2. 调用func会进入getCount的词法环境
  3. 解析标识符count,在当前词法环境中未找到,进入外部词法环境
  4. 外部词法环境找到,返回值后叠加。 --> 保存词法环境状态
  5. 再次调用func时,会再次访问外部词法环境,访问count,此时count为11,然后返回。
  6. ……

可以注意到:形成函数的闭包的关键在于:它会保存外部词法环境的状态
但是为什么会这样?

闭包实现 I: 执行上下文也会创建外部环境
  1. 函数调用时,会为该函数创建一个执行上下文
  2. 执行上下文中会创建当前词法环境环境记录,记作CurrentEnvRec
  3. 除了会创建CurrentEnvRec,还会创建外部词法环境的环境记录, 记作OuterEnvRec
  4. 如果OuterEnvRec还有
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值