小谈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)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...
随机推荐
- NOIP模拟赛---1.生气的LJJ (anger)
LJJ刚上完了一节课!这节课是数学课!他知道了加减属于一级运算,乘除属于二级运算,幂则属于三级运算,而幂的优先级>乘除的优先级>加减的优先级(这是几年级的数学课).但是,从上一套试卷+上一 ...
- 卷积神经网络(CNN)新手指南 1
http://blog.csdn.net/real_myth/article/details/52273930 卷积神经网络(CNN)新手指南 2016-07-29 18:22 Blake 1条评论 ...
- 【安卓手机通用】android adb shell 命令大全
浏览:3116 | 更新:2013-10-17 17:05 | 标签:安卓 android 一.[什么是shell] Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口.它是命 ...
- Unity3D中的函数方法及解释
一.刷新函数 Update 当MonoBehaviour启用时,其Update在每一帧被调用. LateUpdate 当Behaviour启用时,其LateUpdate在每一帧被调用. FixedUp ...
- mysql--学生课程成绩表
创建表student: CREATE TABLE `student` ( `sid` INT(11) NOT NULL AUTO_INCREMENT, `sname` VARCHAR(20) NOT ...
- ajax--2017年1月15日
听说点六下就能复制了? ajax: 一般处理程序(数据接口):ashx 跨语言传递数据:xml: 结构不清晰 代码量比较大 查找起来比较费事 非面向对象结构 json: 结构清晰 代码量相对较小 面向 ...
- 最小化安装Linux记录
挂载点: /boot 挂载点 100M swap 交换分区 / 根分区 最小化安装: 基本--基本.兼容库.调试工具 开发--开发工具 修改hostname 永久设置:/etc/sysconfig/ ...
- 14个华丽的javascript图表资源和插件
最近我分享一许多css/jquery 有用的资源,这里我将介绍一些用于构建华丽图表的javascript资源和插件,图表是展示数据最有效的方式. 建立一张图表有很多不同的方法,比如falsh.java ...
- realvnc viewer 5.3.2无需输入用户名和密码访问远程桌面
我从https://www.realvnc.com/download/viewer/下载了realvnc viewer用于访问远程的Linux桌面,这个版本不需要安装,直接运行就可以了.但在访问远程桌 ...
- 1)Linux学习笔记:crontab命令
crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程 配置文件 ``` SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin: ...