ES6新特性-箭头函数

ES6新特性的学习

  • 一.箭头函数的基础语法
  • 二.箭头函数的高级语法
  • 三.箭头函数的this指向
  • 四.箭头函数与普通函数的区别

一.箭头函数的基础语法

//一般语法:
(参数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相关的问题,事件回调,对象的方法

适合的场景:
因为定时器中的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

你可能感兴趣的:(ES6新特性,javascript,es6,css3,html5,vue.js)