ES6-函数的扩展

Posted yg123-lb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6-函数的扩展相关的知识,希望对你有一定的参考价值。

 

### 1.函数参数的默认值

 

##### 基本用法

 

~~~js
function log(x, y = ‘World‘) {
console.log(x, y);
}

 

log(‘Hello‘) // Hello World
log(‘Hello‘, ‘China‘) // Hello China
log(‘Hello‘, ‘‘) // Hello 比ES5简洁的多

 

function Point(x = 0, y = 0) {
this.x = x;
this.y = y;
}

 

const p = new Point();
p // { x: 0, y: 0 } ES6 的写法还有两个好处:首先,阅读代码的人,可以立刻意识到哪些参数是可以省略的,不用查看函数体或文档;其次,有利于将来的代码优化,即使未来的版本在对外接口中,彻底拿掉这个参数,也不会导致以前的代码无法运行。
~~~

 

**注意**

 

参数变量是默认声明的,所以不能用`let`或`const`再次声明 会报error

 

使用参数默认值时,函数不能有同名参数。

 

参数默认值不是传值的,而是每次都重新计算默认值表达式的值

 

~~~js
let x = 99;
function foo(p = x + 1) { //每次都会重新计算x+1
console.log(p);
}

 

foo() // 100

 

x = 100;
foo() // 101
~~~

 

##### 函数的length属性

 

就是没有默认值的参数的个数

 

##### 作用域

 

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。

 

### 2.rest参数

 

ES6 引入 rest 参数(形式为`...变量名`),用于获取函数的多余参数,这样就不需要使用`arguments`对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

 

arguments ---当实参个数多于形参个数时通过arguments 访问

 

~~~js
function add(...values) {
let sum = 0;

 

for (var val of values) {
sum += val;
}

 

return sum;
}

 

add(2, 5, 3) // 10

 


// arguments变量的写法
function sortNumbers() {
//arguments不是数组 需要先转换成数组 rest不需要
return Array.prototype.slice.call(arguments).sort();

}

 

// rest参数的写法
const sortNumbers = (...numbers) => numbers.sort();
~~~

 

#### 3.函数的name属性

 

~~~js
var f = function () {};

 

// ES5
f.name // ""

 

// ES6
f.name // "f"
~~~

 

如果将一个匿名函数赋值给一个变量,ES5 的`name`属性,会返回空字符串,而 ES6 的`name`属性会返回实际的函数名。

 

`Function`构造函数返回的函数实例,`name`属性的值为`anonymous`。

 

`bind`返回的函数,`name`属性值会加上`bound`前缀。

 

~~~js
(new Function).name // "anonymous"

 

function foo() {};
foo.bind({}).name // "bound foo"

 

(function(){}).bind({}).name // "bound "
~~~

 

#### 5.箭头函数

 

~~~js
var f = v => v;

 

// 等同于
var f = function (v) {
return v;
};
//如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。

 

var f = () => 5;
// 等同于
var f = function () { return 5 };

 

var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
return num1 + num2;
};

 

// 如果箭头函数的语句多于一句就用花括号 并且使用return语句返回。
var sum = (num1, num2) => { return num1 + num2; }

 

//直接返回一个对象时,必须在对象外面加上圆括号
// 报错
let getTempItem = id => { id: id, name: "Temp" };

 

// 不报错
let getTempItem = id => ({ id: id, name: "Temp" });
~~~

 

 

 

**箭头函数有几个使用注意点。**

 

(1)函数体内的`this`对象,就是定义时所在的对象,而不是使用时所在的对象。

 

(2)不可以当作构造函数,也就是说,不可以使用`new`命令,否则会抛出一个错误。

 

(3)不可以使用`arguments`对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。

 

(4)不可以使用`yield`命令,因此箭头函数不能用作 Generator 函数。

 

上面四点中,第一点尤其值得注意。`this`对象的指

 

**箭头函数的this指向**

 

`this`对象的指向是可变的,但是在箭头函数中,它是固定的。

 

`this`指向的固定化,并不是因为箭头函数内部有绑定`this`的机制,实际原因是箭头函数根本没有自己的`this`,导致内部的`this`就是外层代码块的`this`。正是因为它没有`this`,所以也就不能用作构造函数。

 

 

 

以上是关于ES6-函数的扩展的主要内容,如果未能解决你的问题,请参考以下文章

003-正则的扩展数值的扩展函数的扩展数组的扩展对象的扩展

ES6扩展——函数扩展之剩余函数

ES6-04:函数的扩展

ES6 之函数扩展和对象扩展

ES6新特性:Function函数扩展, 扩展到看不懂

ES6--函数扩展