<ES6>函数
简介
- ES6在ES5的基础上做了大量改进,使编程更加灵活,更少出错。
参数默认值
- ES5非严格模式下,命名参数的变化会体现在arguments对象中
1 | function a(b,c) { |
- ES5严格模式下取消了对于arguments对象的同步行为
1 | function a(b,c) { |
1 | function defaultParam(a,b=1) { |
- 默认参数对arguments的影响(在ES6中如果一个函数使用了默认值,无论是否显示定义严格模式,arguments与ES5严格模式保持一致)
1 | function Fun(a,b=1) { |
默认参数表达式
- 注意如果忘记写小括号,则传入默认函数的引用
1 | let num = 1 |
- 可以使用先定义的参数作为后定义参数的默认值(但是反过来的话会产生临时死区TDZ)
1 | function add(first,second = first) { |
- 参数的默认值不能访问函数体内声明的变量(参数和函数体的作用域相互独立)
处理无命名参数
不定参数
- 使用限制:
- 每个函数只能声明一个不定参数 2、不定参数必需放在所有参数的末尾
- 不定参数对arguments的影响:无论是否使用不定参数,arguments对象总是包含所有传入的参数
1 | function pick(object,...keys) { |
- 对象的setter只能包含一个参数
1 | let obj = { |
Function构造函数增强
1 | let Funaa = new Function('a=1','...nums','console.log(a+nums[0])')//11(字符串) |
展开运算符
- 指定数组,打散后作为参数传入函数
1 | let numArr= [1,2,3] |
name属性
- 函数表达式的属性名字比函数赋值的变量权重高
- getter函数名字有get
- 调用bind生成函数名字有bound
1 | function name2() { |
明确函数的多用途
- ES5中判断函数被调用的方法,但是通过Person.call()或者Person.apply()方法调用就无法判断
1 | function Person(name) { |
- 函数有[[Call]]和[[Construct]]方法,分表表示直接调用和new构造
- 元属性new.target(判断函数是否通过new关键字调用)
1 | function bbb() { |
块级函数
- ES5中处理块级函数,ES5严格模式中代码块内声明函数会报错
1 | 'use strict' |
- ES6严格模式下块级函数(代码中块级函数会被提升至块的顶部,而使用let声明的变量不会)
1 | if(true){ |
- ES6非严格模式下,函数提升至外围函数或全局作用域的顶部
1 | if(true){ |
箭头函数
- 没有this\super\arguments\ner.target绑定,箭头函数中的这些由外层最近一个非箭头函数决定
- 不能通过new关键字调用
- 没有原型
- 不可改变this指向
- 不支持arguments对象
- 不支持重复命名参数
1 | let reflec = val=>val//直接返回val |
多个箭头的函数与科里化
1 | var a = b => c => d => { |
尾调用优化
- 尾调用指的是函数作为另一个函数的最后一条语句被执行
- ES6缩减了严格模式下尾调用栈的大小,如果满足以下条件,尾调用不在创建新栈,而是清除并重用当前栈。
- 需要同时满足:
- 尾调用不访问当前函数的变量
- 在函数内部,尾调用是最后一条语句
- 尾调用的结果作为函数的返回值
- 适用于递归函数
1 | function factorial(n,p=1) { |