函数式语言与命令式语言的一个根本不同,就是下面这个两个数交换的例子居然是正确的:

a=1
b=2
a,b=b,a
print a ,b

输出 2 1

究其原因,是环境造成的。什么是环境呢?通俗点讲,你可以将环境看成是一个栈,栈单元的内容就是各个变量的值。可见,上述 a 和 b 赋值时的环境均是 a=1,b=2。再看一个 lisp 的例子:

设环境 r 为 r=( (X.(A B)) (Y.(C D)))

则 r((EXPR (X Y) (CONS X Y)) (CDR Y) (CAR X))

=r1 (CONS X Y)

其中 r1=( (X.(D)) (Y .A) (X .(A B)) (Y . (C D)))

可见列表求值跟上述赋值的结果是一样的,环境决定了自变量的值。

而闭包,则是打包了环境,相当于内部函数是在外层函数的环境下运行的。因此,又有人称 JavaScript 中的闭包是没有释放的资源(若释放了相关资源,调用内部函数就无法得到正确结果了)。