Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >this介绍(理论加例子)

this介绍(理论加例子)

作者头像
用户7293182
发布于 2022-01-17 13:52:30
发布于 2022-01-17 13:52:30
26200
代码可运行
举报
文章被收录于专栏:jQuery每日经典jQuery每日经典
运行总次数:0
代码可运行

与其他语言相比,一个函数的 this 关键字在JavaScript中的表现略有不同。它在严格模式非严格模式之间也有一些区别。

在绝大多数情况下,函数的调用方式决定了this的值。this不能在执行期间被赋值,在每次函数被调用时this的值也可能会不同。ES5引入了bind方法来设置函数的this值,而不用考虑函数如何被调用的。

全局上下文

在全局运行上下文中(在任何函数体外部),this指代全局对象,无论是否在严格模式下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log(this.document === document); // true
// 在浏览器中,全局对象为 window 对象:
console.log(this === window); // true
this.a = 37;console.log(window.a); // 37

函数上下文

在函数内部,this的值取决于函数是如何调用的。

1. 直接调用

因为下面的代码不是在严格模式下执行,并且this的值不会在函数执行时被设置,此时的this的值会默认设置为全局对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function f1(){
 return this;
}
f1() === window; // true

然而,在严格模式下,this将保持他进入执行环境时的值,所以下面的this将会默认为undefined

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function f2(){
 "use strict"; // 这里是严格模式
 return this;
}
f2() === undefined; // true

在严格模式下,如果this未被执行的上下文环境定义,那么它将会默认为undefined。

2. 对象方法中的 this

当以对象里的方法的方式调用函数时,它们的 this 是调用该函数的对象.

下面的例子中,当 o.f() 被调用时,函数内的this将绑定到o对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var o = {
 prop: 37,
 f: function() {
   return this.prop;
 }
};
console.log(o.f()); // logs 37

注意,在何处或者如何定义调用函数完全不会影响到this的行为。在上一个例子中,我们在定义o的时候为其成员f定义了一个匿名函数。但是,我们也可以首先定义函数然后再将其附属到o.f。这样做this的行为也一致:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var o = {prop: 37};
function independent() {
 return this.prop;
}
o.f = independent;
console.log(o.f()); // logs 37

这说明this的值只与函数 f 作为 o 的成员被调用有关系。

类似的,this 的绑定只受最靠近的成员引用的影响。在下面的这个例子中,我们把一个方法g当作对象o.b的函数调用。在这次执行期间,函数中的this将指向o.b。事实上,这与对象本身的成员没有多大关系,最靠近的引用才是最重要的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
o.b = {
 g: independent,
 prop: 42
};
console.log(o.b.g()); // logs 42
3. 原型链中的 this

相同的概念在定义在原型链中的方法也是一致的。如果该方法存在于一个对象的原型链上,那么this指向的是调用这个方法的对象,表现得好像是这个方法就存在于这个对象上一样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var o = {
 f : function(){
   return this.a + this.b;
 }
};
var p = Object.create(o);
p.a = 1;
p.b = 4;
console.log(p.f()); // 5

在这个例子中,对象p没有属于它自己的f属性,它的f属性继承自它的原型。但是这对于最终在o中找到f属性的查找过程来说没有关系;查找过程首先从p.f的引用开始,所以函数中的this指向p。也就是说,因为f是作为p的方法调用的,所以它的this指向了p。这是JavaScript的原型继承中的一个有趣的特性。

4. getter 与 setter 中的 this

再次,相同的概念也适用时的函数作为一个 getter 或者 一个setter调用。作为getter或setter函数都会绑定 this 到从设置属性或得到属性的那个对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function modulus(){
 return Math.sqrt(this.re * this.re + this.im * this.im);}var o = {
 re: 1,
 im: -1,
 get phase(){
   return Math.atan2(this.im, this.re);
 }
};
Object.defineProperty(o, 'modulus', {
 get: modulus, enumerable:true, configurable:true
});
console.log(o.phase, o.modulus); // logs -0.78 1.4142

5. 构造函数中的 this

当一个函数被作为一个构造函数来使用(使用new关键字),它的this与即将被创建的新对象绑定。

注意:当构造器返回的默认值是一个this引用的对象时,可以手动设置返回其他的对象,如果返回值不是一个对象,返回this。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
* Constructors work like this:
*
* function MyConstructor(){
*   // Actual function body code goes here.  
*   // Create properties on |this| as
*   // desired by assigning to them.  E.g.,
*   this.fum = "nom";
*   // et cetera...
*
*   // If the function has a return statement that
*   // returns an object, that object will be the
*   // result of the |new| expression.  Otherwise,
*   // the result of the expression is the object
*   // currently bound to |this|
*   // (i.e., the common case most usually seen).
* }
*/

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

在最后的例子中(C2),因为在调用构造函数的过程中,手动的设置了返回对象,与this绑定的默认对象被取消(本质上这使得语句“this.a = 37;”成了“僵尸”代码,实际上并不是真正的“僵尸”,这条语句执行了但是对于外部没有任何影响,因此完全可以忽略它)。

6. DOM事件处理函数中的 this

当函数被用作事件处理函数时,它的this指向触发事件的元素(一些浏览器在使用非addEventListener的函数动态添加监听函数时不遵守这个约定)。

代码语言:javascript
代码运行次数:0
运行
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);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 jQuery每日经典 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript 中的 this
本文为慕课网 JavaScript深入浅出 JavaScript 中的 this笔记。
零式的天空
2022/03/02
1.2K0
Javascript中的this指向
多层嵌套的对象,内部方法的this指向离被调用函数最近的对象(window也是对象,其内部对象调用方法的this指向内部对象, 而非window);
超级大帅比
2021/09/12
1K0
JavaScript 之 this 详解
JavaScript作为一种脚本语言身份的存在,因此被很多人认为是简单易学的。然而情况恰恰相反,JavaScript支持函数式编程、闭包、基于原型的继承等高级功能。由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用 apply 或 call 调用。本文就采撷些例子以浅显说明在不同调用方式下的不同含义。 全局的t
晚晴幽草轩轩主
2018/03/27
1.1K0
详解JavaScript的this对象
箭头函数本身无法与 this 进行绑定,所以箭头函数中使用的this是指向上层作用域。call、bind、apply 对箭头函数中this无效。
Learn-anything.cn
2021/12/23
6090
关于 JavaScript 中 this 的详细总结
在 JavaScript 中,函数中的 this 指向,很多同学总是理不清楚【这必然会带来一些问题】。确实,JavaScript 中,函数的 this 指向比较复杂多变。它和你调用的方式有关系,和 **严格模式** 或者 **非严格模式** 有关系,和你是否使用了箭头函数有关系,和你在使用函数时是否传入了 this 有关系,和你是否主动修改了调用对象有关系。
零式的天空
2022/03/24
3650
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
6020
Javascript基础回顾 之(三) 面向对象
一文读懂Js中的this指向
this关键字是一个非常重要的语法点。毫不夸张地说,不理解它的含义,大部分开发任务都无法完成。
hellocoder2029
2022/10/10
9870
双向数据绑定中重要属性-Object.defineProperty()详解
给这个对象添加一个fullName属性,fullName的值为obj.firstName-obj.lastName
用户10106350
2022/10/28
8630
双向数据绑定中重要属性-Object.defineProperty()详解
[OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中-es6-Object.defineProperty()定义属性
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
landv
2020/07/17
7290
JavaScript原型与继承
对于使用过基于类的语言 (如 Java 或 C++) 的开发人员来说,JavaScript 有点令人困惑,因为它是动态的,并且本身不提供一个 class 实现。(在 ES2015/ES6 中引入了 class 关键字,但那只是语法糖,JavaScript 仍然是基于原型的)。
用户1428723
2020/08/06
5770
Js创建对象的方式
Js创建对象的方式,这里的对象除了指Js内置Object对象之外还有更加广义上的面向对象编程中的对象。
WindRunnerMax
2020/08/27
5.6K0
深入浅出JavaScript之this
JavaScript中的this比较灵活,根据在不同环境下,或者同一个函数在不同方式调用下,this都有可能是不同的。但是有一个总的原则,那就是this指的是,调用函数的那个对象。
哲洛不闹
2018/09/18
2930
深入浅出JavaScript之this
Javascript 原型链
每个实例对象(object)都有一个私有属性(称之为 __proto__ )指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象(__proto__),层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
超级大帅比
2021/09/06
6080
前端入门12-JavaScript语法之函数声明正文-函数
作为一个前端小白,入门跟着这几个来源学习,感谢作者的分享,在其基础上,通过自己的理解,梳理出的知识点,或许有遗漏,或许有些理解是错误的,如有发现,欢迎指点下。
请叫我大苏
2018/12/24
5810
原型链
每个实例对象(object)都有一个私有属性(__proto__)指向其构造函数的原型对象(prototype)。该原型对象也有自己的原型对象,层层向上直到一个对象的原型对象为null。根据定义null没有原型,并作为原型链的最后一个环节。
用户3258338
2020/03/12
4560
JS-我待this如初见
何为this? this是对象,是在运行时基于函数的执行环境(和对象有关)绑定的,首先,当代码没执行前,或没执行到之前,this 是没有指向的,所以 切记:在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了。因为this的取值是执行上下文环境的一部分,每次调用函数,都会产生一个新的执行上下文环境。 this只要一出现,一定牵扯到函数和对象 一般方法:首先分析this所在的函数是被当做哪个对象的方法调用的,则该对象就是this所引用的对象。 其实,this的取值,分五种情况
双愚
2018/05/28
7190
JavaScript 实践+理论(总结篇):作用域、闭包、this、对象原型
2. 箭头函数不会使用上述四条规则,而是根据当前的词法作用域来决定 this 的,箭头函数会继承外层函数的 this。
沉浸式趣谈
2024/03/13
1680
JavaScript 实践+理论(总结篇):作用域、闭包、this、对象原型
《你不知道的js(上卷)》笔记2(this和对象原型)
this关键字是javascript中最复杂的机制之一。它是一个很特别的关键字,被自动定义在 所有函数的作用域中。
陨石坠灭
2020/01/21
7360
JS 原型链
Function 是JavaScript 里最顶层的构造器,它构造了系统中的所有对象,包括定义对象、系统内置对象、甚至包括它自己。
用户8921923
2022/10/24
2.4K0
JS 原型链
理解JS 原型链
一直以来对于JavaScript 的原型链的概念,始终有些东西有一种模糊感,最近刚好有时间就塌下心认真的把《JavaScript高级程序设计》中相关内容认真读了一遍,也查看了很多网上很多资料,以前很多不明白的地方也渐渐明白了起来。 写一篇文章记录一下最近学习的感悟。
九旬
2020/10/23
1.8K0
理解JS 原型链
相关推荐
JavaScript 中的 this
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验