说明
ES6对于函数有很多的扩展,让函数的写法变得更丰富,其中包括:
1.可以为参数指定默认值
ES6 之前,不能直接为函数的参数指定默认值,而ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面:
function log(x, y = 'World') {
console.log(x, y);
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello
但是有一些限制:
a. 不能用let或const再次声明默认的变量
function foo(x = 5) {
let x = 1; // error
const x = 2; // error
}
b. 使用参数默认值时,函数不能有同名参数
// 不报错
function foo(x, x, y) {
// ...
}
// 报错
function foo(x, x, y = 1) {
// ...
}
c. 定义了默认值的参数,应该是函数的尾参数(不这样写也可以,但是可能会导致一些问题,如默认值失效)
2.rest参数
ES6 引入 rest 参数(形式为“…变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中
function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
3.name属性
函数的name属性,返回该函数的函数名(这个属性早就被浏览器广泛支持,但是直到 ES6,才将其写入了标准)
4.箭头函数
ES6 允许使用“箭头”(=>)定义函数
var f = v => v;
// 等同于
var f = function (v) {
return v;
};
但是使用箭头函数有一些限制:
a. 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。本来在JavaScript中,函数可以视为对象,那么函数体中的this就指向此函数了。但是箭头函数不是对象,那么箭头函数的函数体中的this就指向声明时的对象了。
b. 不可以当作构造函数,也就是说,不可以使用new命令;不可以使用arguments对象,该对象在函数体内不存在,如果要用,可以用 rest 参数代替(即使引用了arguments,它也其实是上层的arguments,而不是箭头函数的arguments);不可以使用super、new.target
d. 不可以使用yield命令,因此箭头函数不能用作 Generator 函数
5.双冒号运算符
用“::”可以绑定函数,双冒号左边是一个对象,右边是一个函数。该运算符会自动将左边的对象,作为上下文环境(即this对象),绑定到右边的函数上面
可以理解为java的“.”