1. 最基本的写法
使用=>
操作符,简化匿名函数的定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| (param1,param2,...,paramN) => { }
var func = () => 1;
let callback; callback = callback || function() {}; callback = callback || () => {};
callback = callback || (() => {});
|
2. 如果函数体只有一条语句,可以省略函数体的大括号
1 2 3 4 5
| (param1,param2,...,paramN) => expression
(param1,param2,...,paramN) => { return expression; }
|
3. 如果参数只有一个,可以省略参数列表的小括号
1 2 3
| singleParam => { statements }
(singleParam) => { statements }
|
4. 如果函数没有参数,参数列表的小括号不能省略
5. 当返回值是对象字面量时,为了避免函数体的大括号与对象字面量的大括号冲突,必须在字面量上加一对小括号
6. 使用可变参数
1
| (param1, param2, ...rest) => { statements }
|
7. 参数默认值
默认情况下参数默认值为undefined
,可以使用param=defaultValue
的方式指定参数的默认值。
1 2 3 4
| (param1 = defaultValue1, param2 = defaultValue2, …, paramN = defaultValueN) => { statements }
|
8. 在参数列表中使用解构赋值
1 2 3 4 5 6 7
| var f = ([a=5, b=6] = [1, 2], {x: c} = {x: a + b}) => a + b + c;
f(); f([3,4]); f([3]); f([3,4],{x:5});
|
9. 对象解构赋值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| var materials = [ 'Hydrogen', 'Helium', 'Lithium', 'Beryllium' ];
materials.map(function(material) { return material.length; });
materials.map((material) => { return material.length; });
materials.map(({length}) => length);
|
10. 箭头函数没有绑定this
变量
this作用域问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function Person() { this.age = 0;
setInterval(function growUp() { this.age++; }, 1000); }
var p = new Person();
|
ES3/5中,可以定义一个变量指向外部对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function Person() { var that = this; that.age = 0;
setInterval(function growUp() { that.age++; }, 1000); }
function Person() { this.age = 0;
setInterval(function growUp() { this.age++; }.bind(this), 1000); }
|
ES6有了箭头函数,就不用这么麻烦了,因为箭头函数中没有this变量:
1 2 3 4 5 6 7 8 9 10
| function Person(){ this.age = 0;
setInterval(() => { this.age++; }, 1000); }
var p = new Person();
|
11. 箭头函数使用call
和apply
方法
1 2 3
| var func = (a,b) => a+b; func.call(null,1,2); func.apply(null,[1,2]);
|
12. 箭头函数没有绑定arguments
变量
箭头函数没有自己的arguments变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| var arr = () => arguments[0]; arr();
var arguments = [1, 2, 3];
var arr = () => arguments[0]; arr();
var f = (...args) => args[0] + n;
function foo(n) { var f = () => arguments[0] + n; return f(); }
foo(1);
|
13. 箭头函数作为对象的方法,注意this的问题
1 2 3 4 5 6 7 8 9 10 11
| var obj = { i: 10, b: () => console.log(this.i, this), c: function() { console.log(this.i, this); } }
obj.b(); obj.c();
|
14. 箭头函数不能作为构造函数
1 2
| var Foo = () => { this.age = 18 }; var foo = new Foo();
|
15. 箭头函数没有prototype
属性
1 2
| var Foo = () => {}; console.log(Foo.prototype);
|
参考:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
本作品采用 知识共享署名 4.0 国际许可协议 进行许可。
转载时请注明原文链接:https://blog.hufeifei.cn/2018/03/WebFront/ES6%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-JS%E4%B8%AD%E7%9A%84lambda%EF%BC%9A%E7%AE%AD%E5%A4%B4%E5%87%BD%E6%95%B0/