ES6中新增了创建函数的方式:“箭头函数”
真实项目中是箭头函数和Function这种普通函数混合使用
箭头函数简化了创建函数的代码
// 箭头函数的创建都是函数表达式方式(变量= 函数),这种模式下,不存在变量提升,也就是函数只能在创建完成后执行,(也就是创建的代码之后执行)
const fn = ([形参])=>{
//函数t体
}
fn(实参)
// 形参只有一个,小括号可以不加
const fn =n=>{};
//函数体中只有一句话,并且是return xxx的,可以省略大括号,和return
const fn = n=>n*10
function 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); //obj
this.name = '珠峰'
}, 1000)
}
}
obj.fn();
箭头函数和普通函数的区别
- 箭头函数语法比普通函数更简洁,(es6每一种函数都可以使用形参默认值,和剩余运算符)
- 箭头函数没有自己的this,他的this是继承 函数所处上下文中的this(使用call,apply等任何方式都无法改变this的指向)
- 箭头函数没有arguments,只能基于…arg获取传递的参数集合(数组)
- 箭头函数不能被new执行(因为箭头函数中没用this也没有prototype)