this梳理

JS中的this真的很坑,这篇文章仅用来梳理一些常见的知识点和疑问。
首先,先列出this的一些关键的理解点:

  • this就是调用call方法时传递的第一个参数
  • 在常见的对象使用中,只要不使用call方法指定第一个参数,this就是指向对象本身
  • 顺着第二点,如果使用call传递参数,那么this就是变化的,这时候的this就指向call方法传递的第一个参数
  • 在一些常用API中,比如浏览器的API或者jQuery的API中,如果涉及到this的话,这些this是在设计这些API的时候就已经指定好了的
  • 如何知道this具体指代什么?有三种方法:1、console.log(this)直接打出来看看;2、看源码(对于大多数人都不可能);3、看相应的文档(这个很好用)。

以上就是关于this的一些重要的知识点,接下来我们一条一条来理解。

1、this就是调用call方法时传递的第一个参数
var a =function(){
  console.log(this)
}
a()

这个函数调用打出来的结果是window,a()可以写出a.call()没有传递参数,也就是说this是没有传进去的,在这种情况下,浏览器就会默认this就是window本身。

再看另一串代码:

var object = {
  a: function(){
    console.log(this)
  }
}
object.a()

这段代码执行的结果是获得了object
object.a()可以改写成 object.a.call(object) ,这两者是完全等价的。如果不理解可以看这篇文章:this 的值到底是什么?一次说清楚

2、在对象的使用中,如果不使用call方法改变this,那么this就是指对象本身
let module = {
  a: function(){
    console.log(this)
  }
}
module.a()

调用打出来的结果就是module本身,而且module.a()可以改写成module.a.call(module)或者this.a.call(this)其实都是一样的。

当然,如果这时候使用call方法指定了this的话就另当别论了,这就涉及到我们上面说的第三点。

let b = 1
let module = {
  a:function(){
    console.log(this)
  }
}
module.a.call(b)

这个结果打出来的就是1,因为this本身是可变的,就是call方法的第一个参数,在这里就是变量b。

3、使用bind来绑定this

this的值是变化的,有些时候我们需要this不改变,这就需要JS的另一个API bind了。

var a = 5
var module = {
  a: 10,
  add: function(){
    console.log(this.a + 5)
  }
}
module.add()  // 15   这里传了this,相当于module.add.call(module)
var b = module.add  //this变化了,这里是window
b()  // 10  这里没传this,相当于b.call() this默认是window

var c = b.bind(module) //将this绑定为module,bind返回一个新的函数
c()  // 15

var b = module.add.bind(module)  //这样也行,只是上面的简写,bind返回新的函数
b() //调用这个函数

4、当我们使用一些具体的API的时候,this是什么呢?
button.onclick = function(){
  console.log(this)
}

在这个例子中,打出的this就是点击的对象button本身。

body.addEventListener('click', function(){
  console.log(this)
})

这个this的结果就是body本身也就是添加事件委托的对象,和e.currentTarget是一致的。

再举一个jQuery的例子:

$('body').on('click','div',function(){
  console.log(this)
})

这个this就是匹配的div了。

从以上的例子可以看出来,在使用不同的API的过程中,得到的this是不一样的,那么我们如何确定?方法就是开头说的那样,要么console.log(this)打出来看,要么就直接去看对应的API文档。

今天先写到这里吧~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,270评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,135评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,737评论 18 399
  • 微信朋友圈, 简书小江湖。 欲识真面目, 务必高立足。
    刘豫州阅读 1,067评论 0 6
  • 讲师正在论述他的一个极其重要的观点:“当一个人错了的时候,他妥协退却了,他是明智的;当一个人正确的时候,他妥协退却...
    梓毓爸阅读 1,742评论 2 3

友情链接更多精彩内容