JS中的普通函数和箭头函数的this相关知识总结


关于《你所不知道的JS上》、《es6入门》的笔记整理

1、this到底是什么

this 是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调 用时的各种条件。this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式

当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文)。这个记录会包 含函数在哪里被调用(调用栈)、函数的调用方法、传入的参数等信息。this 就是记录的 其中一个属性,会在函数执行的过程中用到。

也就是说,this是记录调用中的一个属性,提供了一种更优雅的方式来隐式的“传递”了一个对象引用,可以将API设计的更加简洁且易于复用(下面是具体的几个例子)。

  • 单独使用,this表示全局对象
  • 在方法中,this 表示该方法所属的对象。
  • 在函数中,this 表示全局对象。
  • 在函数中,在严格模式下,this 是未定义的(undefined)。
  • 在事件中,this 表示接收事件的元素。

3、为什么要使用this

主要参考阮一峰老师的的网络日志JavaScript 的 this 原理

JavaScript 语言之所以有this的设计,跟内存里面的数据结构有关系。
借鉴阮一峰老师的图片
当对象的属性的值是一个函数时,引擎会将函数单独保存在内存中,然后再将函数的地址赋值给foo属性的value属性。这样由于函数是一个单独的值,所以它可以在不同的环境(执行上下文)执行

JavaScript 允许在函数体内部,引用当前环境的其他变量。

var f = function () {
   
  console.log(x);
};

上面代码中,函数体里面使用了变量x。该变量由运行环境提供。

现在问题就来了,由于函数可以在不同的运行环境执行,所以需要有一种机制,能够在函数体内部获得当前的运行环境(context)。所以,this就出现了,它的设计目的就是在函数体内部,指代函数当前的运行环境。

var f = function () {
   
  console.log(this.x);
}

var x = 1;
var obj = {
   
  f: f,
  x: 2,
};

// 单独执行
f() // 1

// obj 环境执行
obj.f() // 2

2、如何判断this指向

调用位置是理解this绑定指向的关键,调用位置就是函数在代码中被调用的 位置(而不是声明的位置)。清楚调用位置才能回答这个问题:这个 this 到底引 用的是什么?

最重要的是要分析调用栈(就是为了到达当前执行位置所调用的所有函数)。我们关心的 调用位置就在当前正在执行的函数的前一个调用中。

function baz(){
   
    // 当前调用栈是:baz 
    // 因此,当前调用位置是全局作用域 
    console.log( "baz
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值