update: 箭头函数
This commit is contained in:
parent
ea62903be5
commit
ea8c465b43
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user