写代码的时候遇到这个问题了,在这里复习一下

  1. 非箭头函数

    非箭头函数的this指向比较好理解,就是调用这个函数的对象,举个栗子:
var obj = {
foo: {
bar: 3,
foo:{
bar: 4,
foo: function a() { console.log(this.bar) },
},
},
bar: 2
}; var foo = obj.foo.foo.foo;
var bar = 1; obj.foo.foo.foo(); //由obj.foo.foo调用,所以此时this指向它,所以打印的this.a为4
foo(); //由window调用,所以this指向window,打印1
  1. 箭头函数

    箭头函数的this指向,网上看到有一种说话是:箭头函数的this指向定义他的对象,这样理解是错误的。。。

    严格来讲应该是:箭头函数的this指向定义它的上下文对象,更通俗一点来说就是指向定义箭头函数的那个形成函数作用域的函数所在对象(个人理解,有疑问的话可以在评论区讨论一下)

    举个栗子
var obj = {
foo: {
bar: 3,
foo() {
var bar = 4;
return () => { console.log(this.bar) };
},
},
bar: 2
}; var foo = obj.foo.foo;
var bar = 1;
obj.foo.foo()() // 此时this指向obj.foo对象,打印3
foo()() // 此时this指向window,打印1

需要注意的是,执行函数的时候箭头函数才被定义,所以下面这个栗子打印结果才会不一样

下面这段代码最后打印出来都是3

var obj = {
foo: {
bar: 3,
foo() {
var bar = 4;
return () => { console.log(this.bar) };
},
},
bar: 2
}; var foo = obj.foo.foo(); // 改了这里
var bar = 1;
obj.foo.foo()() // 3
foo() // 3

最后,看一下把箭头函数换成普通函数的写法

var obj = {
foo: {
bar: 3,
foo() {
var bar = 4;
return function() { console.log(this.bar) };
},
},
bar: 2
}; var foo = obj.foo.foo;
var bar = 1; obj.foo.foo()() // 1
foo()() // 1

总之就是,使用箭头函数的this需要考虑它被定义的时候所在函数作用域的this,使用普通函数只用看谁调用了它。

最新文章

  1. .NET积累
  2. Zookeeper:通过yarn实现大型分布式管理系统
  3. awk分隔符设定为多个字符或字符串
  4. cell自适应高度
  5. SQL Server游标的使用【转】
  6. bootstrap弹出层效果
  7. 《Play for Java》学习笔记(二)基本的CRUD应用
  8. 【模块应用】MFRC522开发笔记
  9. Java [Leetcode 206]Reverse Linked List
  10. Jekyll学习:基本使用方法
  11. JBoss7 如何用脚本 启动 和 停止
  12. ceil与intval区别
  13. vue 用less
  14. MySQL技巧(二)——无限级分类表设计
  15. Html链接标签:
  16. Quartz 定时器任务调度配置(以及如何配置quartz启动执行一次)
  17. Unity游戏推送技术
  18. mysql查找某连续字段中断的编号
  19. 最小k度限制生成树
  20. VML元素的相关资料

热门文章

  1. 驱动开发:内核封装WSK网络通信接口
  2. 基于iNeuOS工业互联网平台的板材实时质检系统
  3. Halocn双目相机标定
  4. Java 同步锁ReentrantLock与抽象同步队列AQS
  5. 云原生学习笔记-1-docker
  6. jmeter中下一接口依赖上一接口的参数,上一个接口存在分页时,如何在下一接口循环读取上一接口的数据?
  7. Js前端导出csv
  8. linux全新机器环境搭建流程梳理
  9. 【面试题总结】JVM02:JVM参数调优、类加载机制
  10. day35-JSON&Ajax03