1.python闭包的栗子
def make_adder(addend):
def adder(augend):
return augend + addend
return adder
p = make_adder(23)
q = make_adder(44)
print p(100)
print q(100)
这里比较特殊的就是make_adder是一个函数,而该函数由定义了一个新的函数,并且在新的函数内使用了外层函数中的参数addend。
关于闭包,专业的名词解释是:闭包(CLosure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。
实际上,闭包是起函数作用,并能相操作对象一样操作的对象。
2.函数式编程思想
所谓“第一等公民”,指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
举栗如下:
var print = function(i){ console.log(i);}; //定义一个函数
[1,2,3].forEach(print); //将函数作为变量
2)只用“表达式”,不用“语句”
表达式是一个单纯的运算过程,总是有返回值;而语句是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。原因是函数是编程的开发动机,一是为了处理运算,不考虑系统的读写(I/O)。
3)没有“副作用”
1)代码简洁,开发迅速:函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
2)接近自然语言,易于理解:栗子-----表达式(1 + 2) * 3 - 4,可以写成函数式语言:subtract(multiply(add(1,2), 3), 4)
3)更方便的代码管理:函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。
4)易于“并发编程”:函数式编程不需要考虑"死锁"(deadlock),因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。
栗子:
var s1 = Op1();
var s2 = Op2();
var s3 = concat(s1, s2);