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

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。

时间: 2024-07-29 06:40:57

《JavaScript应用程序设计》一一2.3 lambdas的相关文章

JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型_基础知识

ECMAScript是一种动态类型的语言,构建于5种简单数据类型(Undefined.Null.Boolean.Number.String)和一种复杂数据类型(Object)的基础之上.这篇文章就来复习一下简单数据类型,我会尽量从编程实践的角度来描述,下面代码运行环境为FireFox 14.0.1. 简单数据类型 简单数据类型 取值 Undefined undefined(只有一个值) Null null(只有一个值) Boolean true|false(只有两个值) Number 数值 St

JavaScript高级程序设计(第3版)学习笔记9 js函数(下)_基础知识

再接着看函数--具有魔幻色彩的对象. 9.作为值的函数 在一般的编程语言中,如果要将函数作为值来使用,需要使用类似函数指针或者代理的方式来实现,但是在ECMAScript中,函数是一种对象,拥有一般对象具有的所有特征,除了函数可以有自己的属性和方法外,还可以做为一个引用类型的值去使用,实际上我们前面的例子中已经有过将函数作为一个对象属性的值,又比如函数也可以作为另一个函数的参数或者返回值,异步处理中的回调函数就是一个典型的用法. 复制代码 代码如下: var name = 'linjisong'

JavaScript高级程序设计(第3版)学习笔记8 js函数(中)_基础知识

6.执行环境和作用域 (1)执行环境(execution context):所有的JavaScript代码都运行在一个执行环境中,当控制权转移至JavaScript的可执行代码时,就进入了一个执行环境.活动的执行环境从逻辑上形成了一个栈,全局执行环境永远是这个栈的栈底元素,栈顶元素就是当前正在运行的执行环境.每一个函数都有自己的执行环境,当执行流进入一个函数时,会将这个函数的执行环境压入栈顶,函数执行完之后再将这个执行环境弹出,控制权返回给之前的执行环境. (2)变量对象(variable ob

JavaScript高级程序设计(第3版)学习笔记7 js函数(上)_基础知识

变量类型 在说函数之前,先来说说变量类型. 1.变量:变量在本质上就是命名的内存空间. 2.变量的数据类型:就是指变量可以存储的值的数据类型,比如Number类型.Boolean类型.Object类型等,在ECMAScript中,变量的数据类型是动态的,可以在运行时改变变量的数据类型. 3.变量类型:是指变量本身的类型,在ECMAScript中,变量类型就只有两种:值类型和引用类型.当变量的数据类型是简单数据类型时,变量类型就是值类型,当变量的数据类型是对象类型时,变量类型就是引用类型.在不引起

JavaScript高级程序设计(第3版)学习笔记6 初识js对象_基础知识

在房子里面可以放你想放的任意事物--如果你有足够的美学造诣,你甚至可以弄一个房中房试试--当然,为了方便管理,我们会给房子里存放的所有事物都会取上一个不重复的名字,比如医药房间里的各种药品名称.在ECMAScript中,你可以在对象中存放任意你想放的数据,同样,我们需要给存放的数据取一个名字--也就是对象的属性名,再存放各种数据.再看看ECMA-262中对象的定义:无序属性的集合,其属性可以包含简单数据类型值.对象或者函数. 进入对象,我开始有些激动了,说实话,让我想起做这系列学习笔记的最初原因

关于《javascript 高级程序设计》里“稳妥构造函数模式“的一点疑问

问题描述 关于<javascript 高级程序设计>里"稳妥构造函数模式"的一点疑问 在<javascript 高级程序设计>第六章6.2.7提到"稳妥构造函数模式"的稳妥对象,指的是没有公共属性,而且其方法也不引用this 的对象,最适合在一些安全的环境中(这些环境中会禁止使用this 和new),或者在防止数据被其他应用程序(如Mashup程序)改动时使用.书中举例如下: function Person(name, age, job){

JavaScript高级程序设计笔记 事件冒泡和事件捕获

原文:JavaScript高级程序设计笔记 事件冒泡和事件捕获 1.事件冒泡 要理解事件冒泡,就得先知道事件流.事件流描述的是从页面接收事件的顺序,比如如下的代码: <body> <div> click me! </div> </body> 如果在body和div内都注册了click的事件监听,之后又点击了div区域,是body先响应还是div先响应?有意思的是,当时的浏览器开发团队IE和Netscape提出了差不多完全相反的事件流的概念.IE的事件流是事件

《JavaScript高级程序设计》学习笔记

系统学习JS, 从<JavaScript高级程序设计>入门,通过学习jQuery或者angularJS源码来进阶. 第1章 JavaScript简介 1.JS问世的目的是处理以前由服务器端语言(如Perl)负责的一些输入验证操作, 由Netscape主导开发,那时候微软的IE还不能独领风骚.最初叫做LiveScript,当时媒体热炒Java,于是改名为JavaScript. JavaScript和ECMAScript通常指同一门语言,但是,JavaScript是ECMA-262标准的实现和扩展

JavaScript高级程序设计(第3版)学习笔记 概述_基础知识

在JavaScript面世之初,没有人会想到它会被应用的如此广泛,也远比一般人想象中的要复杂强大的多,在我自己学习的过程中,曾经有过多次震撼,只是常常没有过多久,很多美轮美奂的用法就又模糊起来,希望通过对JavaScript高级程序设计(第3版)的专题学习笔记,能够较为系统的将基础知识梳理一次,也能够将自己平常学习与工作过程中遇到的一些美妙用法记录下来,便于自己再次学习,当然,也希望可以给有需要的朋友们一些力所能及的帮助. 相关术语 先简要说一下和JavaScript相关的一些背景术语,就不详细

JavaScript高级程序设计 读书笔记之八 Function类及闭包_javascript技巧

Function类 定义 Function类可以表示开发者定义的任何函数,用Function类直接创建函数的语法如下: var function_name=new Function(agrument1,agrument2,...,argumentN,function_body); 每个argument都是一个参数,最后一个参数是函数主体(要执行的代码). 示例: 复制代码 代码如下: function sayHi(sName,sMessage){ alert("Hello "+sNam