某年某月某日,发现什么是闭包,当时怎么也表述清楚这个概念。作为程序猿肯定不能这么没面子唉,大脑努力的憋了一刻钟一秒后,终于憋出了我的闭包定义。

闭包是匿名函数及生成其时的上下文环境

下定义时的感觉估计应该是人生最快乐的事情,这一刻,思维会异常清晰,表达也会非常流畅,有种激扬文字的感觉,也是废话最多的时刻。人生的快乐与成就感估计源于倾倒废话。

纳尼,还是来看个例子吧,写一个用来返回闭包的函数:

#lang racket
(define b 6)
(define (make-closure)
  (let [(a 1)]
    (lambda ()
      (+ a b))))
;生成闭包,其上下文环境为 [(a 1) (b 6)]
(make-closure)
<?php
$b = 6;
function make_closure()
{
    global $b;
    $a = 1;
    return function()use($a, $b){
        return $a + $b
    }
}

一看很容易明白,一说就说的稀里糊涂。经过深刻面壁反思,我觉得这里面还隐藏着对其他一些基础概念的说明

对象的作用域、函数是第一类类型

说白就是函数内的变量能否引用到函数外的变量,本例中的b当然h是可引用的,但变态如PHP,默认就不能,必须使用关键字use或者global。

函数是第一类类型其意即为函数可以作为函数的参数与返回值

对象的生命周期

一般来说函数 make-closure 内的对象(此处为a) 在其调用完后会得到释放,但当闭包内对其引用时却不会立即释放。

上下文环境信息

创建匿名函数的时候,其所能引用到的对象集合。