函数扩展(箭头函数等)
1、函数参数的默认值
(1)与解构赋值默认值结合使用
(2)参数默认值的位置(应该是尾参数)
(3)函数的length属性(返回没有指定默认值的参数个数)
(4)作用域(若设置了参数默认值,参数会形成一个单独的作用域
2 、rest参数
(1)…变量名
(2)函数的length属性,不包括 rest 参数
3、严格模式
函数内部可以设定为严格模式 ‘use strict’(使用默认值、解构赋值、或者扩展运算符情况除外)
4、name属性
(1)函数的name属性,返回该函数的函数名(注意匿名函数中ES5与ES6返回值的不同)
(2)Function构造函数返回的函数实例,name属性的值为anonymous
(3)bind返回的函数,name属性值会加上bound前缀
5、箭头函数
(1)如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分
var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
return num1 + num2;
};
(2)如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。
var sum = (num1, num2) => { return num1 + num2; }
(3)如果箭头函数直接返回一个对象,必须在对象外面加上括号,否则会报错。
let getTempItem = id => ({ id: id, name: "Temp" });
(4)箭头函数可以与变量解构结合使用。
const full = ({ first, last }) => first + ' ' + last;
// 等同于
function full(person) {
return person.first + ' ' + person.last;
}
注意:
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象
(2)除了this,以下三个变量在箭头函数之中也是不存在的,指向外层函数的对应变量:arguments、super、new.target
(3)由于箭头函数没有自己的this,所以当然也就不能用call()、apply()、bind()这些方法去改变this的指向
不适用场合:
(1)定义对象的方法,且该方法内部包括this
(2)需要动态this的时候,也不应使用箭头函数
6、尾调用优化
(1)尾调用:指某个函数的最后一步是调用另一个函数
(2)尾调用优化:如果所有函数都是尾调用,那么完全可以做到每次执行时,调用帧只有一项,这将大大节省内存
(3)注意:只有不再用到外层函数的内部变量,内层函数的调用帧才会取代外层函数的调用帧,否则就无法进行“尾调用优化”。目前只有 Safari 浏览器支持尾调用优化,Chrome 和 Firefox 都不支持。
(4)尾递归:函数调用自身,称为递归。如果尾调用自身,就称为尾递归
(5)柯里化(currying):函数式编程中的概念,意思是将多参数的函数转换成单参数的形式
(6)严格模式:ES6 的尾调用优化只在严格模式下开启,正常模式是无效的
(7)尾递归优化的实现
7、函数参数的尾逗号
ES2017 允许函数的最后一个参数有尾逗号
8、 Function.prototype.toString()
ES2019 对函数实例的toString()方法做出了修改
toString()方法返回函数代码本身,以前会省略注释和空格
修改后的toString()方法,明确要求返回一模一样的原始代码
9、 catch命令的参数省略
JavaScript 语言的try…catch结构,以前明确要求catch命令后面必须跟参数,接受try代码块抛出的错误对象。
ES2019 做出了改变,允许catch语句省略参数