0%

js | 箭头函数

让写函数更加简洁。

ES6 之前的写法

1

1
2
3
function sum(x, y) {
return x + y;
}

2

1
2
3
4
const s = function sum(x, y) {
return x + y;
}
console.log(s(1,2));

ES6 箭头函数

1
2
3
4
const s = (x, y) => {
return x + y;
}
console.log(s(1, 2));

箭头函数写法

  • => 左边是参数
  • => 右边是方法体

一句话方法体

1
2
const s = (x, y) => x + y;
console.log(s(1, 2));

单参数

1
2
3
4
const s = x => {
return x + 1;
}
console.log(s(1));

箭头函数里面的 this

之前的 this

1
2
3
4
5
6
7
8
9
<body>
<button id="btn">按钮</button>
<script>
const oBtn = document.querySelector('#btn');
oBtn.addEventListener('click',function (){
this.style.backgroundColor = '#f00';
})
</script>
</body>

关于 this ,官方说指的是,对于当前对象的引用。

所以,这里面的 this 指的是 oBtn

箭头函数的 this

1
2
3
4
5
6
7
8
9
<body>
<button id="btn">按钮</button>
<script>
const oBtn = document.querySelector('#btn');
oBtn.addEventListener('click',() => {
this.style.backgroundColor = '#f00';
})
</script>
</body>

上述运行是错误的。

Uncaught TypeError: Cannot set property ‘backgroundColor’ of undefined

这个 this 的指向是 Window 顶层对象。

在箭头函数中是没有 this 的。根据,js 的语法规则,js 会自动寻找 this,因为箭头函数没有 this ,所以,js 会在作用域链的上面继续寻找,找到了 Window

那些场景可以用 this

作为回调函数使用

比如

1
2
3
4
5
6
7
8
9
<body>
<button id="btn">按钮</button>
<script>
const oBtn = document.querySelector('#btn');
oBtn.addEventListener('click',() => {
this.style.backgroundColor = '#f00';
})
</script>
</body>

根据上面的解释,这里的 this 指向的是 Window,所以,使用的时候一定要注意。

修改为

1
2
3
4
5
6
7
8
<button id="btn">按钮</button>
<script>
const oBtn = document.querySelector('#btn');
let that = oBtn;
oBtn.addEventListener('click', () => {
that.style.backgroundColor = '#f00';
})
</script>

对象方法

看例子

1
2
3
4
5
6
7
const o = {
name: "1",
showName: function () {
console.log(this.name);
}
}
o.showName();

如果改为箭头函数

1
2
3
4
5
6
7
const o = {
name: "1",
showName: () => {
console.log(this.name);
}
}
o.showName();

什么都不输出。

原因,和前面相同,这里的 this 也是指向 Window

ps: Window 有一个 name 属性,是一个空字符串。如果把 上面代码改为 name1 ,则输出为 undefined

argments

传统方法

1
2
3
4
5
function sum(x, y) {
console.log(arguments);
}

sum(5, 6);

有东西输出。

1
2
3
4
5
const sum = (x, y) => {
console.log(arguments);
}

sum(5, 6);

报错。

ES5 的定义类

ES5

1
2
3
4
function cat(name, sleep) {
this.name = name;
this.sleep = sleep;
}

箭头函数

1
2
3
4
5
6
const cat = (name, sleep) => {
this.name = name;
this.sleep = sleep;
}
const c1 = new cat("1",50);
console.log(c1);

报错

Uncaught TypeError: cat is not a constructor

同样,箭头函数不适合原型方法。

举一个 ES5 的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Cat (name, age, color) {
this.name = name
this.age = age
this.color = color
}
Cat.prototype.foot = 4
Cat.prototype.makeSound = function () {
alert("喵喵")
}
Cat.prototype.sayName = function () {
alert(this.name)
}

var cat1 = new Cat('Tom', 3, 'black')

Cat.prototype.makeSound 这个就是原型方法。

请我喝杯咖啡吧~