update: 箭头函数

This commit is contained in:
qianguyihao 2020-07-15 21:05:45 +08:00
parent ea62903be5
commit ea8c465b43

View File

@ -1,4 +1,3 @@
## 前言
ES6 **函数扩展**方面新增了很多特性例如
@ -24,58 +23,69 @@ ES6在**函数扩展**方面,新增了很多特性。例如:
语法
```js
(参数1, 参数2 ...) => { 方法}
(参数1, 参数2 ...) => { 函数}
```
解释
- 如果有且仅有1个参`()`可以省略
- 如果有且仅有 1 `()`可以省略
- 如果方法体内有且仅有1条语句`{}`可以省略但前提是这条语句必须是 return
- 如果函数体内有且仅有 1 条语句`{}`可以省略但前提是这条语句必须是 return 语句
需要强调的是箭头函数是没有函数名的既然如此那要怎么调用箭头函数呢你可以将箭头函数赋值给一个变量通过变量名调用函数也可以直接使用箭头函数我们来看看下面的例子
### 举例
定义和调用函数传统写法
写法 1定义和调用函数传统写法
```javascript
function fn1(a, b) {
console.log('haha');
return a + b;
}
console.log(fn1(1, 2)); //输出结果3
```
定义和调用函数ES6中的写法
写法 2定义和调用函数ES6 中的写法
```javascript
var fn2 = (a, b) => a + b;
console.log(fn2(1, 2)); //输出结果3
```
二者的效果是一样的
在箭头函数中如果方法体内有两句话那就需要在方法体外边加上{}括号如下
```javascript
var fn2 = (a, b) => {
const fn2 = (a, b) => {
console.log('haha');
return a + b;
};
console.log(fn2(1, 2)); //输出结果3
console.log(fn2(1, 2)); //输出结果3
```
从上面的箭头函数中我们可以很清晰地找到函数名参数名方法体
上面的两种写法效果是一样的
上方代码中
从上面的箭头函数中我们可以很清晰地看到变量名参数名函数体
另外箭头函数的写法还可以精简一下继续往下看
在箭头函数中如果方法体内只有一句话且这句话是 return 语句那就可以把 `{}`省略写法如下
```javascript
const fn2 = (a, b) => a + b;
console.log(fn2(1, 2)); //输出结果3
```
在箭头函数中如果形参只有一个参数则可以把`()`省略写法如下
```js
const fn2 = a => {
console.log('haha');
return a + 1;
};
console.log(fn2(1)); //输出结果2
```
### this 的指向
> 箭头函数只是为了让函数写起来更优雅吗当然不是还有一个很大的作用是与this的指向有关
> 箭头函数只是为了让函数写起来更简洁优雅吗当然不这个原因还有一个很大的作用是与 this 的指向有关
ES5 this 指向的是函数被调用的对象 ES6 的箭头函数中this 指向的是函数被定义时
@ -102,7 +112,6 @@ ES5 中this指向的是函数被调用的对象而 ES6 的箭头函数中
}
```
ES6 中定义方法时我们可以给方法里的参数加一个**默认值**缺省值
- 方法被调用时如果没有给参数赋值那就是用默认值
@ -119,7 +128,6 @@ ES5 中this指向的是函数被调用的对象而 ES6 的箭头函数中
console.log(fn2(1)); //第二个参数使用默认值 5。输出结果6
console.log(fn2(1, 8)); //输出结果9
```
**提醒 1**默认值的后面不能再有**没有默认值的变量**比如`(a,b,c)`这三个参数如果我给 b 设置了默认值那么就一定要给 c 设置默认值
@ -141,11 +149,11 @@ ES5 中this指向的是函数被调用的对象而 ES6 的箭头函数中
如果我把第一个参数改一下改成
```javascript
let x = "smyh";
let x = 'smyh';
function fn(z, y = x) {
console.log(z, y);
}
fn("vae");
fn('vae');
```
此时打印结果是`vae smyh`
@ -188,7 +196,6 @@ function fn(...arg) { //当不确定方法的参数时,可以使用扩展运
}
fn(1, 2, 3); //方法中定义了四个参数但只引用了三个参数ES6 中并不会报错。
```
![](http://img.smyhvae.com/20180304_1650.png)