美文网首页
this梳理

this梳理

作者: 李悦之 | 来源:发表于2017-05-18 23:32 被阅读8次

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文档。

今天先写到这里吧~

相关文章

  • 梳理梳理

    这个周,过得还是比较充实,最大的感觉就是头顶三个鸭梨。最大的压力来自工作。20号,我的职务有了变动,这一变动就面临...

  • 梳理梳理

    昨天的信息量有点大,除了听了混沌大学的年终大课,看了两篇文章,一篇是李笑来老师的《如何在一个小时内构建自己的终身阅...

  • 梳理梳理

    我觉得我得好好梳理下自己的人生了,总觉得自己每天的日子过得有些匆忙,也有一些浑浑噩噩的。 所以我要好好改变自己,趁...

  • 梳理梳理生活

    我的生活很自由,也可以说是散漫,在家的时候时间全由自己支配,几点睡觉,几点打扫卫生,家里的东西放在哪里...

  • 梳理

    梳理人生,梳理公司、梳理家庭、梳理心情、梳理朋友圈,一切皆可梳理。 梳理过后一切清晰明了,透过起初的爱带来从未体会...

  • 梳理

    女儿中考结来后,最近搬回了咸阳的家,花了一周的时间打扫了房子,回老家整理了从西安搬回去的东西,本打算回娘...

  • 梳理

    好长时间没有规律写作了,前段时间因为工作的波动,一直没有安下心来,现在终于忙完了这段时间,工作也谈妥了,一切继续步...

  • 梳理

    大约23:00点睡的觉,做梦梦见爷爷,嘴里喊着各种能想起来的亲属称呼“叔叔,大伯,哥哥,弟弟,姐姐,姑妈……快来啊...

  • 梳理

    近两月,像一只瘪了气的气球,任你如何拍打,都跳跃不起来了,只瘪在那里,抽一下,怏怏地飘忽几下,又悄无声息歇在角落里...

  • 梳理

    累了,陪自己聊会天吧! 昨天回去看老爸老妈,由于小时候的经历,总觉得与他们与其他父母不同!小时候隔...

网友评论

      本文标题:this梳理

      本文链接:https://www.haomeiwen.com/subject/dvdexxtx.html