小谈JavaScript中this的用法
"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的用法的更多相关文章
- 谈 JavaScript 中的强制类型转换 (2. 应用篇)
这一部分内容是承接上一篇的, 建议先阅读谈 JavaScript 中的强制类型转换 (1. 基础篇) 前两章讨论了基本数据类型和基本包装类型的关系, 以及两个在类型转换中十分重要的方法: valueO ...
- javascript中 try catch用法
javascript中 try catch用法 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-08-16我要评论 JS try catch语句一般在什么情况下使用?是必须使 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- JavaScript中return的用法详解
JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...
- JavaScript中this的用法 及 如何改变this的指向
要懂得JavaScript中this的用法,首先需要知道,JavaScript中的作用域相关知识. var fun = function(){ var flag = 1; console.log(fl ...
- 从函数调用的角度,探讨JavaScript中this的用法
js函数调用方式大概可分为:函数调用,构造器调用,call或apply,方法调用四种方式.下面结合一些基础概念和实测代码,从函数调用的角度,探讨JavaScript中this的用法. 1. new对函 ...
- JavaScript中this的用法详解
JavaScript中this的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 thi ...
- 浅谈JavaScript中的null和undefined
浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...
- 浅谈JavaScript中的正则表达式(适用初学者观看)
浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...
随机推荐
- 把中文版NetBeans改成英文版
不管你从官网下的是英文版还是中文版,安装之后操作界面都是中文的.这是因为NetBeans会根据你的操作系统自动设置界面语言,并且没有提供更改的功能.解决的方法也很简单,下面介绍我用过的两种方法: 方法 ...
- C#代码发送邮件
本次测试的邮箱为163邮箱 1.首相对邮箱进行一些设置(详见下图):打开设置选取客户端授权密码项,开启设置:以后在客户端登录时将使用刚刚设置的密码! 2.上干货 public static void ...
- CG之基本光照模型计算公式
在一个基本模型里,一个物体表面的颜色是由放射(emissive).环境反射(ambient).漫反射(diffuse)和镜面反射(specular)等光照作用的总和.每种光照作用取决于表面材质的性质( ...
- Xcode 6配置里定义${ARCHS_STANDARD}为armv7, arm64以及错误
转发:http://www.cocoachina.com/ios/20141013/9897.html 最近一次的Xcode 6更新默认不再支持arm7s架构,究竟是要废除不用呢还是仅仅只是一个疏忽? ...
- linux下利用curl监控web应用状态
监控机器列表文件: server.list 建立监控脚本: webstatus.sh #!/bin/sh monitor_dir=/home/admin/monitor/ #Log记 ...
- nginx做反向负载均衡,后端服务器获取真实客户端ip
首先,在前端nginx上需要做如下配置: location / proxy_set_header host $host; proxy_set_header X-fo ...
- webservice-概念性学习(一)
以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 学习webservice之前呢,我想说我们先学习以下的知识,对你以后的学习 ...
- Nutch是个不错的选择
对搜索引擎的理解:我们并没有google 的源代码,因此学习搜索引擎Nutch是个不错的选择.了解一个大型分布式的搜索引擎如何工作是一件让人很受益的事情.在写 Nutch的过程中,从学院派和工业派借鉴 ...
- MySQL数据文件的导入、导出
1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.导 ...
- Adaptive Server Enterprise ODBC driver connection strings
Adaptive Server Enterprise 15.0 Driver={Adaptive Server Enterprise};app=myAppName;server=myServerAdd ...