普通函数中this
的绑定是很复杂多变的,ES6箭头函数=>
以特定的方式改变this
的行为特性,解决this
相关编码的
一个特殊又常见的痛点。javascript
箭头函数也不老是比普通函数好,当这个函数越长,=>
带来的好处越小,这个函数越短,=>
带来的好处越大。因此
只在确实须要简短的在线函数表达式的时候才用=>
,而对于那些通常长度的函数则无需改变。java
var controller = { makeRequest: function(){ var self = this; btn.addEventListener( "click", function(){ // .. self.makeRequest(); }, false ); } };
在这个例子中,咱们使用var self = this
这一Hack,而后使用self.makeRequest
,由于咱们传入addEVentListener
的回调函数内部,this
绑定和makeRequest()
自己的this
绑定不同。普通函数中的this绑定是动态的,咱们须要经过self
变量依赖词法做用域的可预测性。数组
箭头函数中的this
绑定不是动态的,而是词法的。babel
var controller = { makeRequest: function(){ btn.addEventListener( "click", () => { // .. this.makeRequest(); }, false ); } };
咱们使用=>
箭头函数替代普通函数,箭头函数回调中的词法this
和makeRequest()
中是同样的。=>
就是var self = this
的词法替代形式。函数
咱们使用Babel
转换一下:this
发现,在使用=>
以前,也就是箭头函数的外层,先使用var self = this
保存了this
编码
再看一个例子:spa
var controller = { makeRequest: () => { // .. this.helper(); }, helper: () => { // .. } }; controller.makeRequest();
尽管咱们以 controller.makeRequest(..) 的形式调用,this.helper 引用仍是会失败,由于
这里的 this 并不像日常同样指向 controller。那么它指向哪里呢?它是从包围的做用域中
词法继承而来的 this。在前面的代码中也就是全局做用域,其中 this 指向那个全局对象。code
this
,只有词法this
,继承自父层arguments
数组,只有词法arguments
,继承自父层super
new.target
做用域和做用域链对象
必定要记住箭头函数的特色,在适当的地方使用。
若是是写对象的方法,要使用普通函数,由于普通函数中有this
,通常状况下指向该对象,而箭头函数没有this,则访问不到对象的其余属性了。
若是返回值是一个简单的表达式,且这个函数内部没有this
的引用,且没有自身引用(递归、绑定/解绑定,且不会要求函数执行这些,可使用箭头函数。
若是函数内部有不少语句,仍是要用普通函数,保证可读性。