"this"关键字是JavaScript中广泛应用的一种特性,但它经常也是这门语言中最容易混淆和误解的特性。那么"this"的实际意义是什么?它是如何求值的?

  这里我把 this 出现的场景分为四类,简单的说就是:

    •  普通函数调用

    •  作为方法来调用

    •  作为构造函数来调用

    •  通过 apply 或 call 方法来调用 


  下面我们分别举例说明一下:

  1)作为普通函数调用时

<script type="text/javascript">
function first(){
this.a="100";
console.log(this); //输出window
console.log(this.a); //输出100
}
first();
</script>

在这段代码中函数first作为普通函数调用,实际上first是作为全局对象window的一个方法来进行调用的,即window.first();

所以这个地方是window对象调用了first方法,那么函数first当中的this即指window,同时window还拥有了另外一个属性a,值为100.

<script type="text/javascript">
var a=100;
function first(){
console.log(this.a);
}
first(); //输出100
</script>

同样这个地方first作为window的方法来调用,在代码的一开始定义了一个全局变量a,值为100

它相当于window的一个属性,即window.a=100,又因为在调用first的时候this是指向window的,因此这里会输出100


  2)作为方法来调用时

<script type="text/javascript">
var a = 100;
var obj = {
a:100,
b:function(){
console.log(this.a);
}
}
obj.b(); //输出 100
//这里是obj对象调用b方法,很显然this关键字是指向obj对象的,所以会输出a </script>

  这种情况非常容易理解,b( ) 属于对象 obj,并由 obj进行调用,当执行 obj.b( ) 时,函数是作为对象obj的方法调用的,因此函数体内的this指向的是obj对象,所以会输出100。

  再换种形式:

<script type="text/javascript">
var obj1 = {
a:100,
b:function(){
console.log(this.a);
}
}
var obj2 = {
a:100,
c:first.b
}
obj2.c(); //输出 100
</script>

  这个例子中,虽然b方法是在obj1这个对象中定义,但是调用的时候却是在obj2这个对象中调用,因此this对象指向obj2

 


 

  3)作为构造函数来调用

  先来科普一下构造函数,官方解释为:使自己的对象多次复制,同时实例根据设置的访问等级可以访问其内部的属性和方法。当对象被实例化后,构造函数会立即执行它所包含的任何代码。总与new运算符一起使用在创建对象的语句中。

  简而言之,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。  

<script type="text/javascript">
var a = 2;
   function test(){
     this.a = 1;
   }
   var o = new test();
   console.log(a); //输出结果为 2
console.log(o.a) //输出结果为 1
</script>

  结果很显然,this指代的就是新对象new test( )。


 

  4)通过 apply 方法来调用

  

<script type="text/javascript">
var a = 0;
function test() {
console.log(this.a);
}
var o = {};
o.a = 1;
o.b = test;
o.b.apply(); //输出结果为 0
o.b.apply(o);//输出结果为 1
</script>

  当apply没有参数时,表示为全局对象。所以值为0。

  当给了参数之后,结果变为了1,说明这是this代表的是对象o

  以上就是今天的内容了,

  大家在这里需要注意的是要能够理清 this 所引用的对象到底是哪一个。

  但是不管按那种方法来调用,请记住一点:谁调用这个函数或方法,this关键字就指向谁。

小谈JavaScript中this的用法的更多相关文章

  1. 谈 JavaScript 中的强制类型转换 (2. 应用篇)

    这一部分内容是承接上一篇的, 建议先阅读谈 JavaScript 中的强制类型转换 (1. 基础篇) 前两章讨论了基本数据类型和基本包装类型的关系, 以及两个在类型转换中十分重要的方法: valueO ...

  2. javascript中 try catch用法

    javascript中 try catch用法 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-08-16我要评论 JS try catch语句一般在什么情况下使用?是必须使 ...

  3. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  4. JavaScript中return的用法详解

    JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...

  5. JavaScript中this的用法 及 如何改变this的指向

    要懂得JavaScript中this的用法,首先需要知道,JavaScript中的作用域相关知识. var fun = function(){ var flag = 1; console.log(fl ...

  6. 从函数调用的角度,探讨JavaScript中this的用法

    js函数调用方式大概可分为:函数调用,构造器调用,call或apply,方法调用四种方式.下面结合一些基础概念和实测代码,从函数调用的角度,探讨JavaScript中this的用法. 1. new对函 ...

  7. JavaScript中this的用法详解

    JavaScript中this的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 thi ...

  8. 浅谈JavaScript中的null和undefined

    浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...

  9. 浅谈JavaScript中的正则表达式(适用初学者观看)

    浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...

随机推荐

  1. jQuery Ajax 二次封装

    jQuery Ajax通用js封装 第一步:引入jQuery库 <script type="text/javascript" src="<%=path%> ...

  2. PHP学习笔记-session

    session 在windows中的默认保存在AppDate/Local/Temp

  3. 前端教程&开发模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试-资源汇总

    内容精简 资源这么多,多看看多学习再总结肯定是好的.多读读就算看重了不算浪费时间,毕竟一千个读者就有一千个林黛玉,还有温故而知新,说不定多读一些内容,就发现惊喜了呢.不过,在此也精简一些内容,就1~2 ...

  4. tomcat 优化配置 java-8 tomcat-7

    tomcat 优化配置 , 说明 一.并发优化 1.JVM调优 以下为1G物理内存tomcat配置: JAVA_OPTS="-server -Xms512M -Xmx512M -Xss256 ...

  5. curl讲解第一篇---入门和基本使用

    概念 它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP. curl同样支持HTTPS认证,HTTP POST方法, ...

  6. tp框架链接数据库的基本操作

    <?php namespace Admin\Controller; use Think\Controller; class MainController extends Controller { ...

  7. 【spoj8222】 Substrings

    http://www.spoj.com/problems/NSUBSTR/ (题目链接) 题意 给出一个字符串S,令${F(x)}$表示S的所有长度为x的子串出现次数的最大值.求${F(1)..... ...

  8. jade的特点

    jade特点 1超强的可读性 2灵活易用的缩进 3块扩展 4代码默认进过编码处理,以增强安全性 5编译及运行时的上下文错误报告 6命令行编译支持 7html5模式(使用 !!!5文档类型) 8可选的内 ...

  9. java基础(一)面向对象

    对象就是事物存在的实体,例如:人类,计算机等:而对象被分为两个部分,既动态与静态 类:就是同一事物的统称,如果将世界中的一个事物抽象成对象,类就是这类对象的统称,具有相同特性和行为的一类事物就是类. ...

  10. Android自定义控件之TextView

    转自:http://labs.easymobi.cn/?p=284 有时候Android自带的控件无法满足我们的某些要求,这时就需要我们自定义控件来实现这些功能.比如需要一个TextView里的字倾斜 ...