(param1, param2, …, paramN) => { statements }
(param1, param2, …, paramN) => expression
// 相当于: => { return expression; }
// 当只有一个参数的时候圆括号也可以不加:
(singleParam) => { statements }
singleParam => { statements }
// 没有参数的时候参数部分应该用一对圆括号代替
() => { statements }
// 如果要返回一个字面量的对象,应当把函数体用圆括号括起来:
params => ({foo: bar})
// rest参数和参数默认值也是支持的
(param1, param2, ...rest) => { statements }
(param1 = defaultValue1, param2, …, paramN = defaultValueN) => {
statements }
// 参数列表的解构也是支持的
var f = ([a, b] = [1, 2], {x: c} = {x: a + b}) => a + b + c;
f(); // 6
箭头函数没有this关键字,但是它遵循正常的变量查找规则,即一层层地向外寻找。
function Person(){
this.age = 0;
setInterval(() => {
console.log(this.age++); // 原本这个回调函数的this是指向window的,但是在这里,它指向了Person,因为箭头函数本身没有this,只有一层一层的向外寻找,结果是0、1、2、3、4……
}, 1000);
}
var p = new Person();
严格模式下的箭头函数的this
var f = () => { 'use strict'; return this; };
console.log(f() === window); // true
普通模式下普通函数的this
function fun() {
console.log(this); //结果是Window
}
fun();
严格模式下普通函数的this
function fun() {
'use strict';
console.log(this); //结果是'undefined'
}
fun();
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); //由于箭头函数没有this,所以这句话中的变量b没什么用
}
};
console.log(adder.add(1)); // 将会打印2
console.log(adder.addThruCall(1)); // 仍然会打印2
和它自己的this类似,没有就一层一层向外查
var arguments = [1, 2, 3];
var arr = () => arguments[0]; //这个arguments就指向了全局的arguments变量
arr(); // 所以结果是1
function foo(n) {
var f = () => arguments[0] + n; // 这个arguments就指向了foo的隐藏对象arguments
return f();
}
foo(3); // 所以结果是6(arguments[0]为3)
那么在箭头函数中就用rest参数去替代arguments对象
function foo(n) {
var f = (...args) => args[0] + n;
return f(10);
}
foo(1); // 11
'use strict';
var obj = {
i: 10,
b: () => console.log(this.i, this),
c: function() {
console.log(this.i, this);
}
}
obj.b(); // 打印undefined, Window {...}
obj.c(); // 打印10, Object {...}
所以可以得出结论对象方法中的箭头函数中的this是无法指向对象本身的,而是指向了全局Window。
另外一个例子
'use strict';
var obj = {
a: 10
};
Object.defineProperty(obj, 'b', {
get: () => {
console.log(this.a, typeof this.a, this); // undefined 'undefined' Window {...}
return this.a + 10; // this表示全局对象Window, 因此 'this.a' 返回 'undefined'
}
});
var foo = 'bar';
var foo = new Foo(); // TypeError: Foo is not a constructor
var Foo = () => {};
console.log(Foo.prototype); // undefined