探索Javascript中this的奥秘

 更新时间:2016年12月11日 09:02:08   作者:CDXwangwang  
本文介绍了JavaScript中的this关键字在各种情况下的含义,实例都很简单,这样更能有助于加深理解。虽然这只是js中一个很小的概念,但借此我们可以了解js中函数的执行环境,充分掌握this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余。

前言: this 是 JavaScript 比较特殊的关键字,运用的地方之广,方式之灵活奠定了它的强大,但同时注定了它的难用 。自己刚开始学的时候被绕的很晕,为了彻底弄懂它查了很多资料。然后将自己学的东西整理了一下,以通俗易懂的方式表达出来,权当做学习笔记,同时也可以给有需要的童鞋做下参考^_^

什么是this?

this 关键字的含义是明确且具体的,即指代当前对象。即意味着这个 this 是在某种相对情况下才成立的。

this 被分为三种情况:全局对象、当前对象或者任意对象;判断处于那种情况,这完全取决于函数的调用方式,JavaScript 中主要的函数调用有以下几种方式:

  • 作为普通函数调用
  • 作为对象方法调用
  • 作为构造函数调用
  • 使用 apply 或 call 调用

1. 作为普通函数调用
    ------这是我们最常用的方法,这种调用方式属于全局调用,这里的 this 指的是全局对象

function test(){
 this.a = 5;
 alert(this.a);
 alert(this);
}
test(); // 5 [object Window]

如上所示:定义在全局的函数, 函数的所有者就是当前页面, 也就是window对象,所以example()的调用对象就是Window,因此这里面的this就代表Window;

换一种写法:

var a = 5;
function test(){
 var a = 10;
 alert(this.a);
}
test(); //5

如上所示:test()函数内部也声明了一个变量a,但是调用test()的结果为5,说明此时函数内部的this代表了全局对象即Window;

再换种写法:

var a = 5;
function test(){
 this.a = 10;
}
test();
alert(a); //10

如上所示: 调用test()函数,更改了全局变量a的值,即表明此时this代表全局对象。

2.作为对象函数的调用
   ------当函数被某个对象调用时,此时this就指向了这个对象

var name="张三";
 var person={
  name:"李四",
  showName:function(){
   alert(this.name);
  }
 }
 person.showName(); //输出 李四
 var other=person.showName;
 other(); //输出 张三

如上所示:执行 person.showName()的结果为 李四,说明此时showName中的this指向了person;

而把person.showName赋给other后,因为other属于全局变量,可以看成是window对象的一个属性。所以当调用other(),相当于调用window.other(),因此this指向了window, 输出结果为 张三;

所以说作为函数对象调用时,this就指向了这个调用的对象。

3. 作为构造函数调用
    ------构造函数,就是通过这个函数生成一个新对象(object),这时候的 this 就会指向这个新对象;

function animal(){
 this.name = "豆豆";
}
var dog = new animal();
alert(dog.name); // 输出 豆豆

如上所示:通过new关键字生成一个object类型的对象并把它赋给dog,执行这个构造函数的话,会吧构造函数作用域里的this指向这个对象,在这里就是指向了dog,因此this.name 等同于dog.name, 所以输出结果为豆豆。

4.使用 apply 或 call 调用
    ------apply()是函数对象的一个方法,它应用某一对象的一个方法,用另一个对象替换当前对象。

var a = "张三";
function test(){
 alert(this.a);
}
var b = {};
b.a = "李四";
b.n = test;
b.n(); //李四
b.n.apply(); //张三
b.n.apply(b); //李四

如上所示:b.n()----因为调用的对象为b,所以this指向了b,this.a  == b.a  ,所以结果为李四;

     b.n.apply----当apply()的参数为空时,就是没有对象去替换当前对象,默认用全局对象,所以this指向window,结果为张三;

     b.n.apply(b)----指将当前的this指向替换成b,因此this指向了b,结果为李四

(本文参考了网上的资料和一些书籍,如有错误之处,欢迎指出,将及时改正,么么哒O(∩_∩)O)

总结:本文介绍了 JavaScript 中的 this 关键字在各种情况下的含义,实例都很简单,这样更能有助于加深理解。虽然这只是 JavaScript 中一个很小的概念,但借此我们可以了解 JavaScript 中函数的执行环境,充分掌握this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余。最后,感谢您的观看。 

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家

相关文章

  • js的写法基础分析

    js的写法基础分析

    js的写法基础分析,学习js的朋友可以参考下。
    2011-01-01
  • 一文详解如何跳出map或者foreach循环

    一文详解如何跳出map或者foreach循环

    javascript中的遍历方法有很多,今天主要总结一下这些遍历方法如何跳出循环,这篇文章主要给大家介绍了关于如何跳出map或者foreach循环的相关资料,需要的朋友可以参考下
    2023-11-11
  • 用javascript实现记录来宾姓名的代码

    用javascript实现记录来宾姓名的代码

    用javascript实现记录来宾姓名的代码...
    2007-03-03
  • JavaScript代码生成PDF文件的方法

    JavaScript代码生成PDF文件的方法

    如何使用js生成pdf文件呢,下面通过本文给大家分享JavaScript代码生成PDF文件的方法,需要的朋友参考下吧
    2016-02-02
  • js实现的订阅发布者模式简单示例

    js实现的订阅发布者模式简单示例

    这篇文章主要介绍了js实现的订阅发布者模式,结合完整示例形式分析了js订阅发布者模式相关实现与使用方法,需要的朋友可以参考下
    2020-03-03
  • 微信小程序实现滑动删除

    微信小程序实现滑动删除

    这篇文章主要为大家详细介绍了微信小程序实现滑动删除,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 使用Promise进行异步处理的操作步骤

    使用Promise进行异步处理的操作步骤

    在JavaScript中,异步操作是非常常见的,如网络请求、文件操作、定时任务等,Promise是一种用于管理异步操作的解决方案,它使得异步代码变得更易读、易于组合和错误处理更加集中,本文将详细介绍如何使用Promise进行错误处理,需要的朋友可以参考下
    2025-03-03
  • 详解javascript传统方法实现异步校验

    详解javascript传统方法实现异步校验

    这篇文章主要为大家介绍了javascript实现异步校验的方法,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • js项目中添加ts支持实现示例详解

    js项目中添加ts支持实现示例详解

    这篇文章主要为大家介绍了如何在js项目中添加ts支持实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • JavaScript和JQuery获取DIV值的方法示例

    JavaScript和JQuery获取DIV值的方法示例

    这篇文章主要介绍了JavaScript和JQuery获取DIV值的方法,结合具体实例形式对比分析了javascript与jQuery获取页面div元素值的实现技巧,需要的朋友可以参考下
    2017-03-03

最新评论