一谈到ES6的箭头函数,大家可能想到的优点就是语法更简洁,因为去掉了return、function、{}等输入。

但是设计者果真就是出于简洁的目的推出的箭头函数吗?显然不是。

  => 箭头函数this设计的主要目的,以特定的方式改变this的行为特性,解决this相关编码的一个常见的痛点。

  => 箭头函数this设计的主要目的,以特定的方式改变this的行为特性,解决this相关编码的一个常见的痛点。

  => 箭头函数this设计的主要目的,以特定的方式改变this的行为特性,解决this相关编码的一个常见的痛点。

来看一个例子来看看这个痛点:

var utils = {
getData:function(a,b){
var self = this;
builtinModules.addEventListener('click',function(){
self.getData(12,34);
},false)
}
}

在这个例子里面,为了确保this的指向正确,所以我们用了一个变量缓存this:

 var self = this;

然后再通过self去调用 this。。

self.getData(12,34);

this是动态绑定的,在本例子中,getData() 的this 和 btn.click回调函数的this是不同。这种方式在ES5中太常见来

那么ES6推出的箭头函数,应该如何写?是怎么解决这个痛点呢?

  getData:function(a,b){
// var self = this;
builtinModules.addEventListener('click',() => {
this.getData(12,34); // 这里的this 跟 getData{}函数体里面的this 保持一致

},false);
}

看到没有,也就是说,箭头函数,帮我们解决了 var self = this;self.xxxx()的痛点。甚至你可以理解为 箭头函数就是替代了 var self = this这种词法形式;

那么问题来了。。。这种情况该如何解决呢???

var utils = {
getData:(a,b) => {
// var self = this;
builtinModules.addEventListener('click',() => {
this.getUser();// error !!! 这里的this并不是指向的utils,所以访问不到getUser.
},false);
},
getUser:(a,b) => {
// ...xxxx
}
}

切记,箭头函数中的this,指向包围它的作用域,看如下代码:

console.log(this);//--假设此处的this指向window

var obj = {
b:this,
a:()=>{
console.log(this);

}
}
obj.a(); // window
console.log(obj.b) // window

var obj2 = {
a:function(){
console.log(this);
},
b:this
}
obj2.a(); // {a:f,b:window}

  

有上述例子可见:箭头函数this指向其包裹的作用域,this指向了window(假设此时最外层的this是window)。

而function里面的this(obj2.a),就是指向该obj2这个对象。

也就是说,一个对象里面的箭头函数,和普通function函数来比,箭头函数的this 层级高于普通函数。

那么何时应该使用this函数呢?从一张图可以看出来:

最后,切记,千万别认为箭头函数就是为了少打字。不管多打字少打字,你得明白你输入的每个字的意义目的所在。

ES6-你不知道的箭头函数的更多相关文章

  1. ES6中箭头函数的作用

    我们知道在ES6中,引入了箭头函数,其本质就是等同有ES5中的函数.类似于下面的写法: let test1=() => “abc”; let test2=() => { return “a ...

  2. Es6中箭头函数与普通函数的区别

    Es6中箭头函数与普通函数的区别? 普通function的声明在变量提升中是最高的,箭头函数没有函数提升 箭头函数没有属于自己的this,arguments 箭头函数不能作为构造函数,不能被new,没 ...

  3. es6的箭头函数和es5的function函数区别

    一.es6的箭头函数es6箭头函数内部没有this,使用时会上朔寻找最近的this不可以做构造函数,不能使用new命令,因为没有this函数体内没有arguments,可以使用rest参数代替不能用y ...

  4. Es6 之箭头函数 初学

    不积跬步,无以至千里;不积小流,无以成江海! // ES5 var selected = allJobs.filter(function (job) { return job.isSelected() ...

  5. 关于es6的箭头函数使用与内部this指向

    特型介绍:箭头函数是ES6新增的特性之一,它为JS这门语言提供了一种全新的书写函数的语法. 'use strcit'; let arr = [1,2,3]; //ES5 let es5 = arr.m ...

  6. ES6笔记② 箭头函数

    特性介绍 箭头函数是ES6新增的特性之一,它为JS这门语言提供了一种全新的书写函数的语法. //ES5 function fun(x,y){ return x+y; } console.log(fun ...

  7. 关于ES6 用箭头函数后的 this 指向问题

    最近写完小程序后, 开始学习React, 因为有编译器, 就直接用ES6 新语法了, 中间自然离不开  () => { console.log('箭头函数的this是指向哪的问题')}; var ...

  8. 进阶路上有你我-相互相持篇之ES6里箭头函数里的this指向问题

    首先复习下普通函数里的this指向: function test(){ console.log(this) } test() 你会秒杀的毫无疑问的回答:window,针对普通函数:谁调用了函数  函数 ...

  9. es6之箭头函数

    => 箭头函数是ES6增加的函数表达式.将function关键字和函数名都删掉,并使用“=>”连接参数列表和函数体(低版本浏览器不支持) 箭头函数看上去只是语法的变动,其实也影响了this ...

  10. ES6学习--箭头函数

    1. 箭头函数基本形式 let func = (num) => num; let func = () => num; let sum = (num1,num2) => num1 + ...

随机推荐

  1. MongoDB Sharding分片 shell 脚本

    #!/bin/sh CONFIG_NAME=$ CONFIG_PORT=$ SERIAL_NUM=$ STORAGE_HOME=$ if [ ! -n "$CONFIG_NAME" ...

  2. C#版微信公众号支付|微信H5支付|微信扫码支付问题汇总及解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存.代码在文章结尾处,有需要的 ...

  3. [ZZ] NumPy 处理数据

    NumPy-快速处理数据--ndarray对象--数组的创建和存取 https://www.cnblogs.com/moon1992/p/4946114.html NumPy-快速处理数据--ndar ...

  4. SQL脚本--总耗CPU最多的前个SQL --平均耗CPU最多的前个SQL

    --总耗CPU最多的前个SQL SELECT TOP 20 total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.t ...

  5. locate中使用variant

    利用locate构造多字段查询,采用variant很方便,简介如下, //构造查询多字段,例如'编号;姓名'形式 aLookField :=  FieldByName ('关键字1').AsStrin ...

  6. es6入门总结

    let和const命令 let命令 循环体的let变量只对花括号作用域可见,花括号外不可见 循环体的语句部分是一个父作用域,而循环体内部是一个单独的子作用域 let声明的变量不存在变量提升,未声明的使 ...

  7. 【算法习题】数组中任意2个(3个)数的和为sum的组合

    题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...

  8. 微信小程序web-view的简单思考和实践

    微信小程序的组件web-view推出有一段时间了,这个组件的推出可以说是微信小程序开发的一个重要事件,让微信小程序不会只束缚在微信圈子里了,打开了一个口子,这个口子或许还比较小,但未来有无限可能. 简 ...

  9. java中抽象类是否可以继承实体类?

    一道java 常见面试题,网上找到的几乎每个 java 面试笔试题大全或集锦里都能找到这道题. 题目如下:问: 抽象类是否可继承实体类 (concrete class) 答: 抽象类是可以继承实体类, ...

  10. c3.cpp

    Char16_t(在字符串前加u)和char32_t(在字符串前加U)都是无符号的,数字代表长度(底层长度随系统而定) 在函数bool中,任何非0值都代表真(即使他是个负数),只有0代表false 一 ...