美文网首页你不知道的JavaScriptJava 核心技术
JavaScript中的this的指代对象详解

JavaScript中的this的指代对象详解

作者: a333661d6d6e | 来源:发表于2018-11-02 22:10 被阅读1次

在javascript里面,this是一个特殊的对象,它不像其他编程语言那样,是存储在实例中的值,直接指向此实例。
而是作为一个单独的指针,在不同的情况之下,指向不同的位置,这也是为什么我们会将它搞混的原因。

image.png

下面我们来看下,它在不同情况下分别是怎样一种形态

1.在全局作用域时:

这个是最好理解的,即在全局作用域下this指向window,也就是在全局作用域下,this与window是等价的:

console.log(this === window); //true

另外,由于在此时,this等价于window,所以我们在全局作用域声明的变量也会指向this:

var x = 1;
console.log(this.x);//1
console.log(window.x);//1

当然,我们还有另一种声明变量的方法:

x = 0;
function setNum(){
x = 1;
};
console.log(this.x);//0
setNum();
console.log(this.x);//1

当声明变量时不使用 var 或者 let的话 此时相当于给全局的this添加或者改变属性值

看起来还是很简单的,不就是个等价于window的对象么。

当然,如果仅仅是这样,this或许根本就没有存在的必要了。

而this最让人头疼的部分就是它在不同的作用域下,它的形态也是截然不同的


image.png

2.当在函数中时:

到这里时,this的陷阱已经渐渐显露出来了

这里为什么说是当在函数中而不是局部作用域时,要讲这个,首先我们要清楚function是什么

在javascript中,function作为js中的一个特殊对象:函数,是有着不同的形态的

我们通常看到的:

function set(){
 var x = 0;
};

在这一形态下,其内部的this是与全局作用域时一样,直接指向window,所以其形态 依然等价于window。

var x = 0;
function num(){
 this.x = 1;
}
console.log(this.x);//0
num();
console.log(this.x);//1
//欢迎加入全栈开发交流群一起学习交流:864305860

这里就是经常容易犯得错误,很多人觉得,当this已经在一个function之中时,其目前所处位置为当前的局部作用域,所以目前指向的应该是此函数

但是,如果你将这个函数实例化(new)之后,此函数将生成一个全新的环境,此时在此实例中的this也会随之发生变化,它将指向所在实例。

num = "0";
function setThis(){
 this.num = "1";
}
console.log(this.num);//"0"
new setThis();
console.log(this.num);//"0"
console.log(new setThis().num);//1

这是因为,当实例化之后,此函数变成了一个实例对象,而其内部的this也自然而然的指向了此实例对象,如同一开始的this是指向window的对象一样指向了它所在的实例

另外,在我们写javascript的时候,我们通常还会有一种调用函数的方法,即为元素绑定事件,比如button.addEventListener(‘click', fn, false)等,如果在fn里面需要使用到this的话,那么此时this指向事件处理元素,也就是button

注意:this作为关键字,你是无法复写它的。

3.总结:

1. 在全局作用域中(所有函数外)出现的this,指全局对象。

在浏览器中就是window对象。

2. 在函数内部出现的this,指什么要看这个this所在的函数的被调用方式。

不论这个this出现在什么样的函数中,层次有多深,结构多复杂,只要看直接包含它的函数即可。例如:

(1) 被直接调用时,this指全局对象window。

 func();

(2) 被作为构造函数调用时,this指当前正在构建的对象。

new func();

(3) 被作为某个对象A的方法调用时,this指方法所属的对象A。

A.func();

(4) 使用函数的apply或call方法调用时,this指第一个参数B。

 func.apply(B, [m, n, ...]);
 
 func.call(B, m, n, ...);

本次给大家推荐一个免费的学习群,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。
对web开发技术感兴趣的同学,欢迎加入Q群:864305860
,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。
最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。

相关文章

  • JavaScript中的this的指代对象详解

    在javascript里面,this是一个特殊的对象,它不像其他编程语言那样,是存储在实例中的值,直接指向此实例。...

  • JavaScript 上下文执行对象

    在大多数语言中,this 指代当前的类;而在 JavaScript 中,this 则是指拥有这个方法的对象,取决于...

  • JavaScript对象的详解

    JavaScript对象的详解 JavaScript对象你不知道的细节 为什么有的编程规范要求用 void 0 代...

  • Js对象

    JavaScript中的五种基本数据类型详解JavaScript中基本数据类型和包装类型 说“JS中一切皆对象”也...

  • 好程序员分享JavaScript六种继承方式详解

    好程序员分享JavaScript六种继承方式详解,继承是面向对象编程中又一非常重要的概念,JavaScript支持...

  • JavaScript中数组对象详解

    Array对象即数组对象用于在单个变量中存储多个值,JS的数组是弱类型的,所以允许数组中含有不同类型的元素,数组元...

  • 在Objective-C中self关键字到底是什么

    在实例方法中Self指代本类的实例对象。在类方法中Self指代类对象 上面就是结论,注意一下类的实例对象和类对象(...

  • (转载)javascript中的this作用域详解

    本文转载于cnblogs--<> Javascript中this的指...

  • Self关键字

    Self关键字代表什么 在实例方法中Self指代本类的实例对象。在类方法中Self指代类对象 为什么可以在方法中使...

  • this在JavaScript中的应用

    this This是JavaScript函数的一个关键字。在全局上下文中(任意函数体外部),this指代全局对象,...

网友评论

    本文标题:JavaScript中的this的指代对象详解

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