深入理解this的理解和用法

什么是this?

JavaScript中函数的this对象是函数在执行时所处的作用域,是关键字,它比较灵活,只有在执行的时候知道它指向了谁!

5种指向

1,指向 window对象即全局对象
在全局作用域下,this指向全局对象。在浏览器中全局对象就是window对象

function test(){
 console.log(this);
}
test();  //window

2,指向最近的对象或声明的对象
当this关键字在一个声明对象内部使用,其值会被绑定到调用该this的函数的最近的父对象

var person = {
 first: 'John',
 last: 'Smith',
 full: function() {
  console.log(this.first + ' ' + this.last);
 },
 personTwo: {
  first: 'Allison',
  last: 'Jones',
  full: function() {
   console.log(this.first + ' ' + this.last);
  }
 }
};
person.full(); // John Smith
person.personTwo.full(); // Allison Jones

3,new 实例化时指向实例化对象
当使用new关键字构建一个新的对象,this会绑定到这个新对象

function Animal(name){
    this.name = name;
    console.log(this.name);
}
var cat = new Animal('cat');

4,call/apply/bind指向第一个参数对象

function add(c, d) {
 console.log(this.a + this.b + c + d);
}
add(3,4); // 
// 延伸一下
a + b + 2 // error  a/b 未定义 会报错
//this.a + this.b + 2 // NaN ,undefined 则不会报错
//说明 undefined + 2 == NaN
var  ten = {a: 1, b: 2}
add.call(ten, 3, 4) //10
add.apply(ten, [3, 4]) //10
// bind 场景
var small = {
 a: 1,
 go: function(b,c,d){
  console.log(this.a+b+c+d);
 }
}
var large = {
 a: 100
}
var bindTest = small.go.bind(large, 1, 2, 3)
bindTest()
// 还有一种写法
var bindTest = small.go.bind(large, 1) //已知部分参数
bindTest(2, 3) //剩余参数追加
small.go.bind(large, 1)(2,3)

5,es6中箭头函数中的this对象
定义到对象属性方法中,指向window
定义在原型链上的this,指向window
定义在构造函数中,会报错
定义在事件函数中,指向window

let names = 'window-names'
const obj = {
   name: 'es6',
    say: () => {
        console.log(this === window)
        console.log(this.names)  
    }
}
obj.say() //true
// 原型链上
 Cat.prototype.sayName = () => {
    console.log(this === window)
    return this.name
  }
  const cat = new Cat('mm');
  cat.sayName()
  // true     this为window
  // ""  window.name 为空 

  // 解决方法 ===> sayName 更改成普通函数  
  
  function Cat(name) {
    this.name = name;
  } 
  Cat.prototype.sayName = function () {
    console.log(this === ff)
    return this.name
  }
  const ff = new Cat('ff');
  ff.sayName();
// 事件函数 箭头函数在声明的时候就绑定了它的上下文环境,要动态改变上下文是不可能的。
const button = document.getElementById('mngb');
  button.addEventListener('click', ()=> {
    console.log(this === window) // true
    this.innerHTML = 'clicked button'
  })
  // 其实我们是要this执行被点击的button
  // 解决方法 --> 回调函数用普通函数
  const button = document.getElementById('mngb');
  button.addEventListener('click', function(e){
    console.log(this === button)
    console.log(e.target)
    this.innerHTML = 'clicked button'
  })
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容