以前JavaScript写法:
function sum(num1, num2) { return num1 + num2; }
ES6箭头函数的写法:
const sum =(num1,num2)=>{ return num1 + num2; }
更简化的写法
const sum = (num1, num2) => num1 + num2; function(){}
等同于 :
()=>{} x => x * x //相当于 function (x) { return x * x; }
再看个同样的例子:
let func1 = function(){ console.log('普通无参匿名函数'); } func1(); let func2 = ()=>{ console.log('箭头函数'); } func2();
如果是一条语句的话可以省略
let func3= ()=>console.log('我是另一个箭头函数'); func3();
如果是有参数的话:
/* let func3 = (a)=>console.log(a); // 一个参数可以省略()最好写上 func3('333'); let func4 = (a,b)=>console.log(a,b); // 一个参数可以省略()最好写上 unc4('444','213'); // let func5 = (a,b) => a+b; // console.log(func5(1,5)); let func5 = (a,b) => { return a+b; } console.log(func5(1,5));
箭头函数中的this:
重要特性:箭头函数没有this,所以this是定义的时候,外部所在的对象是他的this。调用的时候的this也没有arguments值;
当在函数中使用一个变量的时候,首先在本函数内部查找这个变量,如果找不到那就去找他的父级函数,依次往上推,最后到window对象,全局变量默认挂载是在window对象下的
console.log(this); let obj = { x: 100, //属性x show() { console.log(this); //延迟500毫秒,输出x的值 setTimeout(function () { console.log(this.x);//因为这里的setTimeout的this指向的是window对象,而在window中并没有找到x,所以返回undefined }, 500) } }; obj.show(); //undefined
如果是使用箭头函数的话就会改变this的指向
console.log(this); var obj = { x: 100, //属性x show() { //延迟500毫秒,输出x的值 setTimeout(() => { console.log(this); console.log(this.x); }, 500); }, }; obj.show(); //打印结果:100
当定义obj的show( )方法的时候,我们在箭头函数编写this.x,此时的this是指的obj,所以this.x指的是obj.x。而在show()被调用的时候,this依然指向的是被定义时候所指向的对象,也就是obj对象,故打印出:100。
证明了一个观点:
箭头函数中的this指向的是定义时的this,而不是执行时的this
箭头函数中不绑定this,箭头函数中的this指向是它所定义的位置,可以简单理解成,定义箭头函数中的作用域的this指向谁,它就指向谁
箭头函数的优点在于解决了this执行环境所造成的一些问题。比如:解决了匿名函数this指向的问题(匿名函数的执行环境具有全局性),包括setTimeout和setInterval中使用this所造成的问题