天天看点

《JavaScript应用程序设计》一一2.3 lambdas

本节书摘来华章计算机出版社《javascript应用程序设计》一书中的第2章,第2.3节,作者:eric elliott 更多章节内容可以访问云栖社区“异步社区”公众号查看。

lambdas是指那些作为数据使用的函数,它可以是函数的传入参数,也可以是函数的返回值,更可以是一个字面量,总之它的用法与普通的表达式十分类似。

举例来说:

被传入foreach()方法的addto()函数就是一个lambda,它在数组中的每项值上做调用。需要注意的是,它在其函数作用域中是可以访问到result变量的。ecmascript 5规范定了诸多像数据方法foreach()这样的函数枚举器。更多细节请参见“函数式编程”一节。

在javascript中, lambda的使用场景多见于:

· 在入参上执行一连串操作。

· 为dom元素操作添加事件监听器。

· 用于在当前函数执行完成时,调用的回调函数。

· 包裹现有函数,为其添加新的功能(例如混入日志埋点这样的“横向”功能,具有这类行为的函数称为函数装饰者)。

· 将接受多个参数的函数包转化为接受少量参数的函数,或者将函数中的某些参数值固定(参见 “偏函数应用与函数加里化”一节)。

· 从一个函数中返回另一个函数。例如,一个函数接受一个参数,调用后返回一个加里化函数,而先前传入的参数已经预设在这个加里化函数的内部。

lambda经常被误认为是匿名函数、闭包、一类函数、高价函数。只能说它们的概念较为类似,但是实际应用场景各不相同。

有些语言使用特殊字符或关键字语法来声明 lambda,从而省略了函数名,但千万不要理所当然得认为它就是匿名函数。名称省略对lambda来说仅仅是一种语法糖,是为了让声明与使用起来更加方便,lambda的首要特性是它能够在函数的输入输出中,被当作数据“传递”,而不在乎它是否已被命名。

人们经常把“闭包”与“lambda”的含义弄混淆,并不是所有的lambda都是闭包,也并非所有的闭包都是lambda。闭包引用了外层函数作用域上的变量,而lambda只是被视为数据的函数,两者从概念上来说还是有差别的,在支持lambda的语言中不见得可以使用闭包。

在javascript中函数是“一等公民”,意味着它们可以被当作一种特殊变量来使用,但这并不表示所有函数都是lambda。lambda 在javascript中更多的是指代一种函数特性,即将函数作为数据来处理的一种能力。

在高价函数中那些从外界传入或返回的函数都可以视作 lambda,一个lambda可能同时也是高价函数,但并不是所有高价函数都是lambda。

注意: 如果一个函数被其他函数作为参数或返回值来使用,那么它便是lambda。

继续阅读