//一般语法:
(参数1, 参数2, …, 参数N) => { 函数声明 }
//相当于:(参数1, 参数2, …, 参数N) =>{ return 表达式; }
(参数1, 参数2, …, 参数N) => 表达式(单一)
// 当只有一个参数时,圆括号是省略的:
(单一参数) => {函数声明}
单一参数 => {函数声明}
// 没有参数的函数应该写成一对圆括号
() => {函数声明}
箭头函数比较适用于原本需要匿名函数的地方,比如用在数组内置方法map、filter、forEach、some、reduce等的回调函数中
*//加括号的函数体返回对象字面表达式:
参数=> ({foo: bar})
//支持剩余参数和默认参数
(参数1, 参数2, ...rest) => {函数声明}
(参数1 = 默认值1,参数2, …, 参数N = 默认值N) => {函数声明}
//同样支持参数列表解构
let f = ([a, b] = [1, 2], {x: c} = {x: a + b}) => a + b + c;
f(); // 6
forEach用法:
写法:array.forEach(function(value,index,arr){})
value:是当前数组中各个的值
index:数组当前项的索引值
arr:数组的本身
filter用法:
写法:array.filter(function(value,index,arr){})
注意的是filter返回的是一个数组,而不是字符串
value:是当前数组中各个的值
index:数组当前项的索引值
arr:数组的本身
some用法:
写法:array.some(function(value,index,arr){})
注意的是some用来寻找满足元素是否存在,返回的是一个布尔值,而且他只会寻找满足条件的第一个元素
value:是当前数组中各个的值
index:数组当前项的索引值
arr:数组的本身
map方法:
写法:array.map(function(value){})
注意的是map返回的是一个数组,而不是字符串
value:是当前数组中各个的值
var elements = [
'a',
'aa',
'aaa',
'aaaa'
];
elements.map(function(element) {
return element.length;
}); // 返回数组:[1, 2, 3, 4]
// 上面的普通函数可以改写成如下的箭头函数
elements.map((element) => {
return element.length;
}); // 返回数组:[1, 2, 3, 4]
这四者的用法基本一致,不过需要根据不同情况选择不同的方法
this 对象的指向是可变的,但是在箭头函数中,它是固定的。箭头函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象。
箭头函数适合与this无关的问题,定时器,数组方法的回调
箭头函数不适合与this相关的问题,事件回调,对象的方法
适合的场景:
因为定时器中的this指向window,所以当使用箭头函数后,他会找最近一层的调用者,也就是下图中的div。
注意到是对象不能产生作用域。
let div = document.querySelector('div');
div.addEvenListener("click",function(){
setTimeout(()=>{
this.style.backgroundColor = "pink";
},1000)
})
一.外形不同:箭头函数使用箭头定义,普通函数中没有
二.箭头函数都是匿名函数:
普通函数可以有匿名函数,也可以有具体名函数,但是箭头函数都是匿名函数。
三.箭头函数不能用于构造函数,不能使用new
普通函数可以用于构造函数,以此创建对象实例。
function Person(name,age){
this.name=name;
this.age=age;
}
let admin=new Person("彭于晏",18);
console.log(admin.name);
console.log(admin.age);
Person用作构造函数,通过它可以创建实例化对象。
但是构造函数不能用作构造函数。
四.箭头函数中this的指向不同
在普通函数中,this总是指向调用它的对象,如果用作构造函数,this指向创建的对象实例。
1.箭头函数本身不创建this
也可以说箭头函数本身没有this,但是它在声明时可以捕获其所在上下文的this供自己使用。
注意:this一旦被捕获,就不再发生变化
var webName="彭于晏";
let func=()=>{
console.log(this.webName);
}
func(); // 输出:彭于晏
箭头函数在全局作用域声明,所以它捕获全局作用域中的this,this指向window对象。
var name = "彭于晏1";
function wrap(){
this.name="彭于晏2";
let func=() => {
console.log(this.name);
}
func();
}
let en=new wrap();// 彭于晏2
(1)wrap()用作构造函数。
(2)使用new调用wrap()函数之后,此函数作用域中的this指向创建的实例化对象。
(3)箭头函数此时被声明,捕获这个this。
(4)所以打印的是彭于晏2,而不是彭于晏1。
2.结合call(),apply()方法使用
箭头函数结合call(),apply()方法调用一个函数时,只传入一个参数对this没有影响。
let obj2 = {
a: 10,
b: function(n) {
let f = (n) => n + this.a;
return f(n);
},
c: function(n) {
let f = (n) => n + this.a;
let m = {
a: 20
};
return f.call(m,n);
}
};
console.log(obj2.b(1)); // 结果:11
console.log(obj2.c(1)); // 结果:11
3.箭头函数不绑定arguments,取而代之用rest参数…解决
每一个普通函数调用后都具有一个arguments对象,用来存储实际传递的参数。但是箭头函数并没有此对象。
function A(a){
console.log(arguments);
}
A(1,2,3,4,5,8); // [1, 2, 3, 4, 5, 8, callee: ƒ, Symbol(Symbol.iterator): ƒ]
let B = (b)=>{
console.log(arguments);
}
B(2,92,32,32); // Uncaught ReferenceError: arguments is not defined
let C = (...c) => {
console.log(c);
}
C(3,82,32,11323); // [3, 82, 32, 11323]
五.总结
1、箭头函数是匿名函数,不绑定自己的this,arguments,super,new.target
2、箭头函数会捕获其所在上下文的this值,作为自己的this值,在使用call/apply绑定时,相当于只是传入了参数,对this没有影响
3、箭头函数不绑定arguments,取而代之用rest参数…解决
4、箭头函数当方法使用的时候,没有定义this绑定
5、箭头函数不能作为构造函数,和 new 一起用就会抛出错误
6、箭头函数没有原型属性
7、不能简单返回对象字面量
参考:
https://blog.csdn.net/qq_42258904/article/details/110083064
https://www.jianshu.com/p/e9392ea2393b