首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >详解JavaScript的this对象

详解JavaScript的this对象

原创
作者头像
Learn-anything.cn
发布于 2021-12-23 15:31:29
发布于 2021-12-23 15:31:29
6540
举报
文章被收录于专栏:learn-anything.cnlearn-anything.cn
一、this 是什么?

this 是当前运行环境的一个属性,指向最近的对象实例。

二、怎么用?
1、全局
代码语言:txt
AI代码解释
复制
<!DOCTYPE html>
<html lang='zh-CN'>
<head>
    <meta charset="utf-8">
    <title>this</title>
    <script>
        // 全局环境下,等同于 window 对象
        console.log(this === window); // true
        a = 37;
        console.log(window.a); // 37

        this.b = "MDN";
        console.log(window.b)  // "MDN"
        console.log(b)         // "MDN"
    </script>
</head>
<body>
    <h1>打开 Console 看结果!</h1>
</body>
</html>
2、函数中this

函数中的this指向调用他的实例对象。

代码语言:txt
AI代码解释
复制
var obj = {a: 'Custom'};
var a = 'Global';
function whatsThis() {
  return this.a;  
}
// 全局调用,this 指向 window 对象
whatsThis();          // Global
// 强制实例对象obj转换为this
whatsThis.call(obj);  // Custom
whatsThis.apply(obj); // Custom
3、方法中this

方法中的 this 是指向最近的对象实例。

代码语言:txt
AI代码解释
复制
var o = {
    prop: 37,
    f: function () {
        return this.prop;
    }
};
console.log(o.f()); // 37

o.b = { g: independent, prop: 42 };
// g()方法中最近实例是b,实例o是再上一层实例
console.log(o.b.g()); // 42
4、箭头函数中this

箭头函数本身无法与 this 进行绑定,所以箭头函数中使用的this是指向上层作用域。call、bind、apply 对箭头函数中this无效。

代码语言:txt
AI代码解释
复制
// 1、this 指向上层作用域
var globalObject = this;
var foo = (() => this);
console.log(foo() === globalObject); // true

var obj = {foo: foo};
console.log(obj.foo() === globalObject); // true

// 2、call、bind 无法改变箭头函数中的 this
console.log(foo.call(obj) === globalObject); // true
foo = foo.bind(obj);
console.log(foo() === globalObject); // true
  • 方法中使用含有this的箭头函数
代码语言:txt
AI代码解释
复制
var obj = {
  bar: function() {
    var x = (() => this);
    return x;
  }
};
// 1、调用方法,this指向对象实例
var fn = obj.bar();
console.log(fn() === obj); // true
// 2、引用方法,this不指向对象实例
var fn2 = obj.bar;
console.log(fn2()() == window); // true
5、原型链上this

原型链上的this也是指向最近对象实例。

代码语言:txt
AI代码解释
复制
var o = {
  f: function() {
    return this.a + this.b;
  }
};
// 对象o是对象p的原型
var p = Object.create(o);
p.a = 1;
p.b = 4;

console.log(p.f()); // 5
6、set、get中this

set、get方法中的this也是指向最近对象实例。

代码语言:txt
AI代码解释
复制
function sum() {
  return this.a + this.b + this.c;
}

var o = {
  a: 1,
  b: 2,
  c: 3,
  get average() {
    return (this.a + this.b + this.c) / 3;
  }
};

Object.defineProperty(o, 'sum', {
    get: sum, enumerable: true, configurable: true});

console.log(o.average, o.sum); // logs 2, 6
7、new与this

new 后面的构造函数,如果没有return语句,就会返回this;如果有,就用返回return语句的对象。

代码语言:txt
AI代码解释
复制
function C(){
  this.a = 37;
}
var o = new C();
console.log(o.a); // logs 37

function C2(){
  this.a = 37;
  return {a:38};
}
o = new C2();
console.log(o.a); // logs 38
8、DOM中this

如果this用在事件回调函数中,那么this指向触发事件的元素。

代码语言:txt
AI代码解释
复制
// 被调用时,将关联的元素变成蓝色
function bluify(e){
  console.log(this === e.currentTarget); // 总是 true

  // 当 currentTarget 和 target 是同一个对象时为 true
  console.log(this === e.target);
  this.style.backgroundColor = '#A5D9F3';
}

// 获取文档中的所有元素的列表
var elements = document.getElementsByTagName('*');

// 将bluify作为元素的点击监听函数,当元素被点击时,就会变成蓝色
for(var i=0 ; i<elements.length ; i++){
  elements[i].addEventListener('click', bluify, false);
}
9、类中this
  • 类方法中this指向调用它的对象实例。
代码语言:txt
AI代码解释
复制
var name = "globalName";
class Example{
    name="className";
    fun(){
        return this.name;
    }
}
// 1、this指向实例对象
let exm = new Example();
console.log(exm.fun());
// 2、使用全局this作为实例对象
let funGlobal = Example.fun;
console.log(exm.fun.call(this)); 
  • 使用bind方法,让类方法中this永远指向类的实例
代码语言:txt
AI代码解释
复制
class Car {
    constructor() {
        this.sayBye = this.sayBye.bind(this);
    }
    sayHi() {
        console.log(`Hello from ${this.name}`);
    }
    sayBye() {
        console.log(`Bye from ${this.name}`);
    }
    get name() {
        return 'Ferrari';
    }
}

class Bird {
    get name() {
        return 'Tweety';
    }
}

const car = new Car();
const bird = new Bird();

// 1、不同实例调用不同结果
car.sayHi(); // Hello from Ferrari
bird.sayHi = car.sayHi;
bird.sayHi(); // Hello from Tweety

// 2、绑定this,结果不会改变
bird.sayBye = car.sayBye;
bird.sayBye();  // Bye from Ferrari
  • 类中this 包含所有非静态方法,静态方法属于类本身属性。
代码语言:txt
AI代码解释
复制
class Example {
    constructor() {
        const proto = Object.getPrototypeOf(this);
        console.log(Object.getOwnPropertyNames(proto));
    }
    first() { }
    second() { }
    static third() { }
}

new Example(); // ['constructor', 'first', 'second']
10、bind()

bind() 方法可以将函数的this 与 某个对象实例进行永久绑定,无需考虑函数的调用方式。已绑定对象无法再次绑定。

代码语言:txt
AI代码解释
复制
function f(){
  return this.a;
}

var g = f.bind({a:"azerty"});
console.log(g()); // azerty

// 已绑定对象无法再次绑定。
var h = g.bind({a:'yoo'}); 
console.log(h()); // azerty

var o = {a:37, f:f, g:g, h:h};
console.log(o.a, o.f(), o.g(), o.h()); // 37, 37, azerty, azerty
三、参考文档

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于 JavaScript 中 this 的详细总结
在 JavaScript 中,函数中的 this 指向,很多同学总是理不清楚【这必然会带来一些问题】。确实,JavaScript 中,函数的 this 指向比较复杂多变。它和你调用的方式有关系,和 **严格模式** 或者 **非严格模式** 有关系,和你是否使用了箭头函数有关系,和你在使用函数时是否传入了 this 有关系,和你是否主动修改了调用对象有关系。
零式的天空
2022/03/24
3890
this 指向(二)
如果要想把this的值从一个环境传到另一个,就要用call/apply/bind方法
小小范
2022/01/19
9340
JavaScript 之 this 详解
JavaScript作为一种脚本语言身份的存在,因此被很多人认为是简单易学的。然而情况恰恰相反,JavaScript支持函数式编程、闭包、基于原型的继承等高级功能。由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用 apply 或 call 调用。本文就采撷些例子以浅显说明在不同调用方式下的不同含义。 全局的t
晚晴幽草轩轩主
2018/03/27
1.1K0
JavaScript 中的 this
本文为慕课网 JavaScript深入浅出 JavaScript 中的 this笔记。
零式的天空
2022/03/02
1.3K0
Javascript中的this指向
多层嵌套的对象,内部方法的this指向离被调用函数最近的对象(window也是对象,其内部对象调用方法的this指向内部对象, 而非window);
超级大帅比
2021/09/12
1.1K0
【前端进阶】深入浅出 JavaScript 中的 this
笔者最近在看 你不知道的JavaScript上卷,里面关于 this 的讲解个人觉得非常精彩。JavaScript 中的 this 算是一个核心的概念,有一些同学会对其有点模糊和小恐惧,究其原因,现在对 this 讨论的文章很多,让我们觉得 this 无规律可寻,就像一个幽灵一样
GopalFeng
2020/10/27
4480
【前端进阶】深入浅出 JavaScript 中的 this
【知乎热门回答】——JavaScript 的 this 原理是什么?
知乎上「JavaScript 的 this 原理是什么?」这个问题下:有一句话解释 JavaScript 的 this 指向的,有抖机灵“骗赞”的;有人说 JavaScript 的 this 某种程度上体现了 JavaScript 初期设计的不足,不需要太过于研究这些糟粕;也有的翻出规范,“照本宣科”,也许这会让你更“云里雾里”。
童欧巴
2021/08/20
6380
JavaScript中的this(你不知道的JavaScript)
JavaScript中的this,刚接触JavaScript时大家都在大肆渲染说其多么多么的灵巧重要,然而自己并不关心;随着自己对JavaScript一步步深入了解,突然恍然大悟,原来它真的很重要!所以,自己花费了大约2周的时间去查贴、翻阅之前读的书籍,将this的全貌展示如下。
奋飛
2019/08/15
5280
Javascript基础回顾 之(三) 面向对象
Javascript中的对象 什么是对象   我们可以把Javascript中对象理解为一组无序的键值对,就好像C#中的Dictionary<string,Object>一样。Key是属性的名称,而value可以为以下3种类型: 基本值(string, number, boolean, null, undefined) 对象 函数 var o = new Object(); o["name"] = "jesse"; //基本值作为对象属性 o["location"] = { //对象作为对象属性
用户1153966
2018/03/14
6200
Javascript基础回顾 之(三) 面向对象
JavaScript 设计模式学习第二篇-关于this、new、bind、call、apply
虽然标题关于this、new、bind、call、apply,但实际上这些都离不开 this,因此本文将着重讨论 this,在此过程中分别讲解其他知识点。
越陌度阡
2020/11/26
3360
你根本不懂Javascript(EP4 this关键字和对象原型)
同时注意如果给this传进原始类型的数据时,对应数据会进行装包(boxing),即转换成对应 Obj (new String(……), new Boolean(……), or new Number(……), respectively)
szhshp
2022/09/21
3290
前端必须理解this的相关知识
this 实际上是在函数被调用时发生的绑定,它指向什么地方完全取决于函数在哪里被调用。
前端老鸟
2022/03/07
2840
重学 this 关键字(看完不全懂您找我哦)
1. 面试会问啊!总有一些面试官喜欢问你一段不可能这么写的代码。看一道经典且古老的面试题(学完本文后,文末会有一道更复杂的面试题等着你哦!)
coder_koala
2019/09/10
5500
重学 this 关键字(看完不全懂您找我哦)
Js创建对象的方式
Js创建对象的方式,这里的对象除了指Js内置Object对象之外还有更加广义上的面向对象编程中的对象。
WindRunnerMax
2020/08/27
5.8K0
JavaScript this 绑定规则
在 JavaScript 中,this 的绑定规则有4种,规则间存在着不同的优先级。
用户1065635
2019/03/21
4910
this介绍(理论加例子)
与其他语言相比,一个函数的 this 关键字在JavaScript中的表现略有不同。它在严格模式和非严格模式之间也有一些区别。
用户7293182
2022/01/17
2750
JavaScript原型与继承
对于使用过基于类的语言 (如 Java 或 C++) 的开发人员来说,JavaScript 有点令人困惑,因为它是动态的,并且本身不提供一个 class 实现。(在 ES2015/ES6 中引入了 class 关键字,但那只是语法糖,JavaScript 仍然是基于原型的)。
用户1428723
2020/08/06
6280
面试题之:JavaScript中this以及apply/call/bind的用法
this 的 4 种绑定规则分别是:默认绑定、隐式绑定、显式绑定、new 绑定。优先级从低到高。
用户10106350
2022/10/28
3220
面试题之:JavaScript中this以及apply/call/bind的用法
带你真正了解 JavaScript 中的 this
任何情况下,this 都不会默认指向函数自己,除非使用 bind 绑定的方式修改 this 为函数自己。
石燕平
2019/10/14
5330
JavaScript基础02--this指向
当函数被调用,一个上下文就被创建。上下文包括函数在哪调用,谁调用的,参数是哪些,等等,上下文中的this,指的就是函数指行期间的this。this的上下文基于函数调用的情况。和函数在哪定义无关,但是和函数怎么调用有关
软件架构师Michael
2022/07/17
2220
相关推荐
关于 JavaScript 中 this 的详细总结
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档