胖箭头函数 Fat arrow functions
,又称箭头函数,是一个来自ECMAScript 2015(又称ES6)的全
新特性。有传闻说,箭头函数的语法=>,是受到了CoffeeScript 的影响,而且它与CoffeeScript中的
=>语法同样,共享this上下文。javascript
箭头函数的产生,主要由两个目的:更简洁的语法和与父做用域共享关键字this。接下来,让咱们来看几个详细的例子
当须要编写一个简单的单一参数函数时,能够采用箭头函数来书写,标识名 =>
表达式。
这样就能够省却 function
和 return
的输入,还有括号,分号等。箭头函数是ES6
新
增长的一个特性。java
let f = v => v;
最直接的感受就是简便,固然不可能就是这么一点好处,下面就一块儿来探讨一下。app
若是箭头函数的代码块多余一条语句,就必需要使用大括号将其括起来,而且使用return
语句返回。函数
因为大括号会被解释位为代码块,因此若是箭头函数直接返回一个对象,必须在外
面加上括号。this
let f = id => ({age: 22, name: Alice })
箭头函数还能够和解构赋值 Destructuring
联合使用.rest
const f = ({first, last}) => first + '' + last;
能够简化回调函数,大大简化和缩短代码行数。code
this
的指向
普通函数与箭头函数有个微小的不一样点。 箭头函数没有本身的this值 ,其this值是通对象
过继承其它传入对象而得到的,一般来讲是上一级外部函数的 this
的指向。继承
function f() { setTimeout( () => { console.log("id:", this.id); },100); } f.call( { id: 42 }); //id: 42;
这个例子中, setTimeout 的参数是一个箭头函数, 每隔100毫秒运行一次,若是是普通函
数,执行的 this
应该指向全局对象, 可是箭头函数会让 this
老是指向函数所在的对象ip
箭头函数里面嵌套箭头函数会有多少个this
呢?
看一个简单的例子
function f() { return () => { return () => { return () => { console.log("id:", this.id); }; }; }; } f().call( {id: 42})()()(); //id: 42
上面的代码中只有一个 this
, 就是函数f的this
。这是由于全部的内层函数都是箭头函数
都没有本身的this,都是最外层f函数的this。
注意:还有三个变量在箭头函数中也是不存在的arguments
, super
, new.target
因此顺理成
章,箭头函数也就不能再用这些方法call()
,apply()
,bind()
,由于这是一些改变this指向的方法,
箭头函数并无this啊。
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));
使用非箭头函数来处理由object.method()
语法调用的方法。由于它们会接收到来自调用者的
有意义的this值。
在其它场合都使用箭头函数。
箭头函数在参数和箭头之间不能换行。
函数体内的this对象就是定义时所在的对象,而不是使用时所在的对象。
'use strict'; var obj = { a: 10}; Object.defineProperty(obj, "b", { get: () => { console.log(this.a, typeof this.a, this); return this.a+10; // represents global object 'Window', therefore 'this.a' returns 'undefined' } });
不能够看成构造函数,简单说就是不能再使用new
命令了,否则会报错。
var Foo = () => {}; var foo = new Foo(); // TypeError: Foo is not a constructor
不可使用arguments
对象,该对象在函数体内不存在,若是实在要用能够用rest
代替。
不可使用yield
命令,箭头函数不可用做Generator
函数。
值得注意的一点就是this
对象的指向是可变的,但在箭头函数内是固定的。
箭头函数是我最喜欢的ES6
特性之一。使用=>来代替function
是很是便捷的。但我也曾见过只使用=>
来声明函数的代码,我并不认为这是好的作法,由于=>也提供了它区别于传统function,其所
独有的特性。我我的推荐,仅在你须要使用它提供的新特性时,才使用它。
当只有一条声明语句(statement)时, 隐式 return
。
须要使用到父做用域中的this
。