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

简介:

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

2.3 lambdas

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

var sum = function sum() {
  var result = 0;

  [5, 5, 5].forEach(function addTo(number) { result += number; });

  return result;
};

test('Lambdas.', function () {
  equal(sum(), 15,
    'result should be 15.');
});

被传入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。

相关文章
|
JavaScript 前端开发 测试技术