this指向/call、apply、bind的关系

1.This指向

在js中this不是固定不变的,它会随着执行环境的改变而改变。要注意的是this取的什么值,是在执行时确认的,定义时无法确认。
this的调用大概分为五种场景:
1.浏览器里,在全局范围内的this指向的时window对象。
2.构造函数中,this指向new出来的那个新的对象。
3.在函数中,this永远指向最后调用他的那个对象
4.Call、apply、bind中的this被强绑定在指定的那个对象上。
5.箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this,要知道前四种方式,都是调用时确定,也就是动态的,而箭头函数的this指向的是静态的,声明是时候就确定了下来。
apply、call、bind都是js给函数内置的一些API调用他们可以为函数指定this的执行,同时也可以传参。

Alt

2.This是什么
理解this之前, 先纠正一个观点,this 既不指向函数自身,也不指函数的词法作用域。如果仅通过this的英文解释,太容易产生误导了。它实际是在函数被调用时才发生的绑定,也就是说this具体指向什么,取决于你是怎么调用的函数。也就是说谁调用的this,this就指向谁
3.call、apply、bind方法
  • call、apply、bind都是改变this指向的方法
  • apply()方法接受两个参数,一个是在其中运行函数的作用域,另一个是参数数组。所有参数都必须放在一个数组里面传进去
  • call()的使用方法和apply()基本是一样的,它们唯一的区别就是在于接收参数的方式不同,call()必须明确的传入每一个参数,传递给函数的参数必须逐个列举出来。apply()的参数必须放入一个数组里面传进去
  • bind()的方法。这个方法会创建一个函数的实例,其this值会被绑定给传入bind()函数的值。除了返回是函数外,它的参数和call一样。
箭头函数中的this始终指向函数定义时的this,而非执行时。

全局的this
在浏览器里,在全局范围内:
1. this等价于window对象;
2.用var声明一个变量和给this或者window添加属性是等价的;
3.如果你在声明一个变量的时候没有使用var或者let、const,你就是在给全局的this添加或者改变属性值。
// 1
console.log(this === window); //true
//2
var name = "Jake";
console.log(this.name ); // "Jake"
console.log(window.name ); // "Jake"

//3
 age = 23;
 function testThis() {
   age = 18;
 }
 console.log(this.age ); // 23
 testThis();
 console.log(this.age ); // 18

总结起来就是:在全局范围内this是老大,它等价于window对象(就是window),如果你声明一些全局变量(任何地方),这些变量都会作为this的属性。


普通函数中的this
对于普通函数中的this指向问题,有一句很有用的话:运行时this永远指向最后调用它的那个对象。

如:
在这里插入图片描述
在这里插入图片描述
因此this指向调用它的对象


在构造函数中,this指向new出来的那个新对象

如:
在这里插入图片描述
在这里插入图片描述
因此在构造函数Fa中,this指向了它创建出的实例So1和So2。


在箭头函数中this是比较特殊的,箭头函数this是父作用域的this,不是调用的this,箭头函数的this指向是静态的,声明它的时候就确定了下来,所以箭头函数的this是无法修改的

如:
在这里插入图片描述
在这里插入图片描述
如上代码:对象Fa中箭头函数info的this指向了Fa的父级作用域也就是window


定时器中的this指向window

在这里插入图片描述
在这里插入图片描述
如上代码可以看出this是指向window


这里有个更详细的this指向

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值