JS中的this指向问题

在JS的各种语法中,this的理解是十分重要的,否则很容易在调用函数时出现错误的结果(血泪教训),所以今天特意记录一下,完善一下自身对于this的认知。

首先,明确一个概念,this是在函数被调用时才发生的绑定(箭头函数除外),也就是说this具体指向什么,取决于你是怎么调用函数。这里给出本文列出的所有this指向结论

  • 以函数形式调用,this指向全局window对象
  • 以对象的方法形式调用,this指向调用方法的对象
  • 以构造函数的形式调用,this指向新创建的那个对象
  • 使用call()和apply()调用时,this指向括号内传递的那个对象参数
  • setTimeout/setInterval/匿名函数执行,this默认指向window对象
  • Function.prototype.bind()方式调用,this指向bind绑定的对象
  • 箭头函数本身无this,在箭头函数中使用this时,他将选择上层作用域的this作为指向

以下的详细介绍包含但不限于以上的各种情况。

普通函数调用

这种方式也是最简单地调用,即函数作为普通函数来调用,如下:

function func(){
   
  console.log(this)
}
func()  // 输出结果Window对象

以上代码可以看出普通方式调用的函数,this指向的是全局的window对象。换种角度
可以理解成普通方式调用等效于window.func(),是window对象调用了该函数,所以this指向了window

对象方法调用

对象方法调用指的就是该函数在对象中被调用,一般是作为对象的属性值,例子如下:

var name = '全局的名儿'
var obj = {
   
  name: '对象的名儿',
  show: function() {
   
    console.log(this.name);
  }
}
obj.show() // 输出 对象的名儿
var func = obj.show;
func() // 输出 全局的名儿

这种作为对象方法来调用时,this就会指向调用该方法的对象,即例子中的obj,所以会打印出对象中的name属性。但是当对象方法被赋值给一个变量并使用普通函数方式调用时,此时this指向的是window对象,因为func通过赋值后就相当定义了func=function() {console.log(this.name);},之后再普通调用就等同于第一种

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值