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

今天先写到这里吧~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

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