1 作用
可以用于需要匿名函数的地方,能够简化函数书写。
2 语法
2.1 基本语法
1 2 3 4 5 6 7 8 9 10
| (param1, param2, …, paramN) => { statements } (param1, param2, …, paramN) => expression
(singleParam) => { statements } singleParam => { statements }
() => { statements }
|
当函数体放在 {} 中时,必须有明确的 return 语句,否则返回值为 undefined。
1 2 3 4 5 6 7 8
| var func = x => x * x;
var func = (x, y) => { return x + y; };
var func = (x, y) => { x + y; };
|
2.2 高级语法
1 2 3 4 5 6 7 8 9 10 11
| params => ({foo: bar})
(param1, param2, ...rest) => { statements } (param1 = defaultValue1, param2, …, paramN = defaultValueN) => { statements }
let f = ([a, b] = [1, 2], {x: c} = {x: a + b}) => a + b + c; f();
|
返回对象字面量时,需要用圆括号括起来。
1 2 3 4
| var func = () => { foo: 1 };
var func = () => ({foo: 1});
|
3 特点
3.1 this
3.1.1 没有自己的 this
箭头函数不会创建自己的 this,它的 this 由箭头函数被创建时的上一层作用域链决定。
1 2 3 4 5 6 7 8 9
| function Person(){ this.age = 0;
setInterval(() => { this.age++; }, 1000); }
var p = new Person();
|
作为对象的方法:
1 2 3 4 5 6 7 8 9 10 11 12
| 'use strict'; var obj = { i: 10, b: () => console.log(this.i, this), c: function() { console.log( this.i, this) } } obj.b();
obj.c();
|
3.1.2 通过 call apply bind 绑定
通过 call apply bind 绑定箭头函数时,第一个参数会被忽略(即无法绑定 this),其他参数会被正常接收。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| var adder = { base : 1, add : function(a) { var f = v => v + this.base; return f(a); },
addThruCall: function(a) { var f = v => v + this.base; var b = { base : 2 }; return f.call(b, a); } };
console.log(adder.add(1)); console.log(adder.addThruCall(1));
|
3.2 arguments 参数
箭头函数不绑定 arguments,只是引用了外层作用域内的 arguments。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var arguments = [1, 2, 3]; var arr = () => arguments[0];
arr();
function foo(n) { var f = () => arguments[0] + n; return f(); }
foo(1); foo(2); foo(3); foo(3,2);
|
3.3 new 操作符
箭头函数不用用作构造函数,使用 new 操作符会报错。
1 2
| var Foo = () => {}; var foo = new Foo();
|
3.4 prototype 属性
箭头函数没有 prototype 属性。
1 2
| var Foo = () => {}; console.log(Foo.prototype); // undefined
|
3.5 运算符优先级
1 2 3 4 5 6 7 8
| let callback;
callback = callback || function() {};
callback = callback || () => {};
callback = callback || (() => {});
|