函数的扩展
前言
-
关于 ES6 的新增内容,第一:知道有什么,第二:知道怎么写
-
本文主要作用在于第一点,知道有什么。达到,在工作中遇到时,能够联想到 ES6,所以仅展示常用内容及简单示例。若所有内容都展示,相当于复制一份文档,没有任何意义。
-
如果需要详细内容,文档链接 : es6.ruanyifeng.com/
参数默认值
-
基本用法
function log(x, y = 'y') {
console.log(x, y)
}
log('x') // x y
-
配合 解构赋值 使用(思考一下下面两者的不同)
function m1({ x = 0, y = 0 } = {}) {
return [x, y]
}
function m2({ x, y } = { x: 0, y: 0 }) {
return [x, y]
}
// 注:不要与 解构赋值的默认值 混淆了。
// (第一个函数的参数:解构赋值默认值 + 参数默认值;第二个函数:参数默认值,没有解构赋值默认值。)
-
位置的影响
-
函数的 length 属性
-
作用域
-
应用
链接:es6.ruanyifeng.com/#docs/funct…
rest 参数(...变量名)
// 获取多余参数,替代 arguments。
function f2(x, ...values) {
console.log(values)
}
f2(1, 2, 3) // [ 2, 3 ]
// 值是纯数组,可以使用数组原型的所有方法 forEach、sort 等等
严格模式
function(){
'use strict'
}
// 如果函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则会报错
name 属性
function foo() {}
console.log(foo.name) // foo
箭头函数
-
没有自己的 this
-
不能当作构造函数(没有 this)
-
不能作为 Generator 函数
-
没有 arguments,用 rest 代替
const f = () => 1
尾调用优化、尾递归
尾调用优化 (Tail Call Optimization, TCO),一种减少非必要调用帧的优化 现在仅 Safari 浏览器,且在开启严格模式下才支持
函数调用自身,称为递归。如果尾调用自身,就称为尾递归
// 尾递归计算阶乘,查看浏览器是否支持尾调用优化
'use strict'
// 计算阶乘,若开启 TCO,即使 n 很大也不会栈溢出
function factorial(n, acc = 1) {
if (n <= 1) return acc
return factorial(n - 1, n * acc)
}
try {
// 测试较大的 n,未开启 TCO 会抛出 RangeError: Maximum call stack size exceeded
console.log(factorial(100000))
console.log('当前浏览器支持 ES6 尾调用优化')
} catch (e) {
console.log('当前浏览器不支持 ES6 尾调用优化,错误信息:', e.message)
}
更多信息:斐波那契数列、蹦床函数、尾递归优化的实现
参数的尾逗号(ES2017)
// 只是为了查看代码修改记录时,不至于因为加了一个逗号,就显示有更改记录
function(
param1,
param2, // 参数末尾这里可以写逗号
){ /* ... */ }
Function.prototype.toString() (ES2019)
function /* foo comment */ foo () {}
// 修改前的返回,不包含注释,函数名后的空格
foo.toString() // function foo() {}
// 修改后的返回,保留注释,函数名后的空格
foo.toString() // "function /* foo comment */ foo () {}"
catch 参数的省略 (ES2019)
// 修改前,catch 必须有参数
try {
// ...
} catch (err) {
// ...
}
// 修改后,可以省略不写
try {
// ...
} catch {
// ...
}