HOWTO · JavaScript
JavaScript Lambda 函数
本文将帮助你了解 JavaScript 中的 lambda 函数。
本页内容
在 JavaScript 中,“Lambda 函数”是读者常用的搜索词,通常指箭头函数,并不是 JavaScript 中独立的一种语法结构。箭头函数提供了简洁的函数表达式写法,但它在 this、arguments 和构造实例方面的行为与普通函数不同。
JavaScript 中的 Lambda 函数是什么?
箭头函数是一种使用 => 编写的函数表达式。和其他函数一样,它可以存储在变量中、作为参数传给另一个函数,或由另一个函数返回。只有一个表达式时,表达式体会隐式返回其值。代码块函数体使用花括号;如果需要返回值,就必须显式写出 return。
箭头函数的语法与示例
多个参数要用括号括起来;只有一个参数时,可以省略括号。例如,const add = (a, b) => a + b 使用表达式体,而 const add = (a, b) => { return a + b; } 使用代码块函数体。只有花括号而没有 return,不会返回表达式的值。
下面的 JavaScript 程序会计算总和,并映射一个短列表:
const add = (a, b) => a + b;
const numbers = [1, 2, 3];
const doubled = numbers.map(number => number * 2);
console.log(`Sum: ${add(2, 3)}`);
console.log(`Doubled: ${doubled.join(", ")}`);
随附的运行证据确认了示例输出:总和为 5,映射结果为 2、4、6。输出块中的 “Sum” 和 “Doubled” 标签保留英文,因为该输出块与规范内容逐字节保持一致。
Sum: 5
Doubled: 2, 4, 6
箭头函数与普通函数有何不同?
箭头函数从外围的词法作用域取得 this。它不会创建自己的 this,因此适合用于需要保留外围方法实例的回调。普通函数的 this 则取决于调用方式;通过 new 构造时,this 指向新建的实例。
箭头函数也没有自己的 arguments 绑定。它不会自动读取外围函数的 arguments;只有外围作用域确实提供了该绑定时,词法查找才可能找到它。如果箭头函数需要收集传入的参数,可以使用剩余参数,例如 (...items) => items.length。
箭头函数不能用 new 调用,也没有供构造函数用途使用的自有 prototype 属性。适合用作构造函数的普通函数声明或表达式可以承担这一角色。箭头函数绑定到变量时,可能会推断出函数名称,但箭头函数本身没有命名函数语法;具名函数表达式是另一种形式。
何时使用箭头函数
如果短回调需要使用词法作用域中的 this,箭头函数通常很合适。例如,items.map(item => item.price) 会提取每个项目的价格,并返回一个新数组。当事件回调需要保留外围的 this 时,箭头函数也可能适用。
如果函数需要由调用方式决定自己的 this、必须用作构造函数,或适合写成函数声明,就应选择普通函数。对于浏览器事件监听器,请记住,箭头回调的 this 不会被设为事件目标;需要目标时可以使用事件对象,或者在调用时绑定的 this 符合需求时使用普通回调。
最佳实践与常见问题
箭头函数的函数体应尽量简短,让读者一眼就能理解。若操作包含多个步骤,可以使用带有明确 return 的代码块函数体;如果命名函数声明能让操作更容易辨认,也可以使用它。描述清晰的变量名能帮助读者理解函数值,但不会让箭头函数变成具名函数表达式。
不要只因为箭头函数写起来更短就选择它。它的词法 this 在某些回调中很有用,但如果函数需要自己的 this,这种行为就不合适。箭头函数也可以包含副作用;是否应避免副作用取决于周围的设计,而不是函数语法本身。
常见问题
JavaScript 中的“Lambda 函数”是什么意思?
这个说法通常指箭头函数。JavaScript 使用 => 编写这类函数;“Lambda 函数”是搜索词,并不是独立的语言结构。
箭头函数如何处理 this?
箭头函数使用外围词法作用域中的 this,不会根据调用方式取得新的 this。
箭头函数可以用作构造函数吗?
不可以。箭头函数不能用 new 调用。要创建实例,请使用适合该用途的普通函数或类。
箭头函数有哪些优点和限制?
简洁的语法可以让回调更易于浏览;词法 this 也能避免重新绑定外围上下文。如果函数需要自己的 this、自有的 arguments 绑定或构造函数行为,箭头函数就不合适。需要收集箭头函数的参数时,请使用剩余参数。