ES6中新增了创建函数的方式:“箭头函数”
真实项目中是箭头函数和Function这种普通函数混合使用
箭头函数简化了创建函数的代码
// 箭头函数的创建都是函数表达式方式(变量= 函数),这种模式下,不存在变量提升,也就是函数只能在创建完成后执行,(也就是创建的代码之后执行)const fn = ([形参])=>{//函数t体}fn(实参)// 形参只有一个,小括号可以不加const fn =n=>{};//函数体中只有一句话,并且是return xxx的,可以省略大括号,和returnconst fn = n=>n*10function fn(n) {return function(m) {return m+(++n);}}const fn =n=>m=>m+(++n);
箭头函数中没有arguments,但是可以基于剩余运算符获取实参集合,而且ES6是支持给形参设置默认值的
let obj = {};let fn = (context = window, ...aaa) => {// console.log(arguments); 报错,箭头函数中没有arguments属性console.log(aaa);// aaa:剩余运算符(把除第一项的,其他传递的实参信息都存储在aaa这个数组中}fn(obj, 10, 20, 30, 40); // context : obj, arg:[10,20,30,40]fn(); // context : window aaa:[]
箭头函数中没有this,它里面用到的this,都是自己所处上下文中的this(真实项目中,一旦涉及this问题,箭头函数慎用)
// let obj = {// name: 'obj',// fn: fn// }// window.name = 'win'// let fn = n => {// console.log(this.name);// }// // 此时Fn所处的上下文中的this都是window// // fn(10) //win// fn.call(obj, 10) //win 不是我们预期的obj// document.body.onclick = fn;// obj.fn(10) // this: window// let obj = {// name: "erha",// fn: function () {// // this:obj 普通函数是有自己的this// let f = () => {// console.log(this); //obj// };// f();// return f// }// }// let f = obj.fn();// f();let obj = {name: 'obj',fn: function () {// console.log(this.name);// 原本期望需要:1s后把obj中的name改成珠峰// setTimeout(function () {// console.log(this); //window// this.name = '珠峰'// }, 1000)// let that = this; //把需要的this存储起来// setTimeout(function () {// console.log(that); //window// that.name = '珠峰' // 需要使用的时候拿出来// }, 1000)setTimeout(() => {console.log(this); //objthis.name = '珠峰'}, 1000)}}obj.fn();
箭头函数和普通函数的区别
- 箭头函数语法比普通函数更简洁,(es6每一种函数都可以使用形参默认值,和剩余运算符)
- 箭头函数没有自己的this,他的this是继承 函数所处上下文中的this(使用call,apply等任何方式都无法改变this的指向)
- 箭头函数没有arguments,只能基于…arg获取传递的参数集合(数组)
- 箭头函数不能被new执行(因为箭头函数中没用this也没有prototype)
