1、函数参数的默认值
ES6允许为函数的参数设置默认值,可以直接写在参数定义的后面。
- 参数中的变量是默认声明的,多以不能使用let或const再次声明
- 定义了默认值的参数应该放在函数参数的末尾
- 函数的length属性返回不包含指定默认值的参数个数(for length为函数预期传入的参数个数)
- 如果参数的默认值是一个变量,则该变量的作用域先是当前函数作用域,再是上级作用域(但需要函数调用时该变量的值已经生成)
let x = 1;
function f(x, y = x) {
console.log(y);
}
f(2) // y === 2
let x = 1;
function f(y = x) {
let x = 2;
console.log(y);
}
f() // y === 1
- 如果函数A的参数默认值是函数B,函数B的作用域为函数声明时所在的作用域即全局作用域而不是A
let foo = 'outer';
function bar(func x => foo) {
let foo = 'inner';
console.log(func()); // outer
}
- 可以利用默认值,用于指定某个参数不可忽略(定义默认值为一个报错函数)
2、rest参数及扩展运算符
rest参数(…变量名)用于获取多余参数
扩展运算符(…)用于将数组转化成数字的参数序列
3、箭头函数
ES6允许使用箭头(=>)定义函数
var f = v => v;
上面的箭头函数等同于:
var f = function(v) {
return v;
}
(1)当箭头函数没有参数或者需要多个参数时,使用圆括号括起来
var f = () => 5;
var sum = (num1, num2) => num1 + num2;
(2)如果箭头函数的代码块多余一行语句,就要使用大括号将其括起来,并使用return语句。
由于{}会被解析成代码块,如果箭头函数直接返回一个对象需要使用括号将该对象括起来。
(3)对于箭头函数,函数体内的this为定义时所在对象,而不是使用时所在的对象,在箭头函数中this对象是固定的。
function foo() {
setTimeout( () => {
console.log("id", this.id);
}, 100);
}
foo.call( { id: 42 } ); // 42
4、尾调用
在函数的尾部调用另外一个函数,不需要再保存函数自己的变量完成优化,只保存内层函数的指针