JavaScript中的this的指代对象详解
在javascript里面,this是一个特殊的对象,它不像其他编程语言那样,是存储在实例中的值,直接指向此实例。
而是作为一个单独的指针,在不同的情况之下,指向不同的位置,这也是为什么我们会将它搞混的原因。
下面我们来看下,它在不同情况下分别是怎样一种形态
1.在全局作用域时:
这个是最好理解的,即在全局作用域下this指向window,也就是在全局作用域下,this与window是等价的:
|
1
|
console.log(this === window); //true |
另外,由于在此时,this等价于window,所以我们在全局作用域声明的变量也会指向this:
|
1
2
3
|
var x = 1;console.log(this.x);//1console.log(window.x);//1 |
当然,我们还有另一种声明变量的方法:
|
1
2
3
4
5
6
7
|
x = 0;function setNum(){x = 1;};console.log(this.x);//0setNum();console.log(this.x);//1 |
当声明变量时不使用 var 或者 let的话 此时相当于给全局的this添加或者改变属性值
看起来还是很简单的,不就是个等价于window的对象么。
当然,如果仅仅是这样,this或许根本就没有存在的必要了。
而this最让人头疼的部分就是它在不同的作用域下,它的形态也是截然不同的
2.当在函数中时:
到这里时,this的陷阱已经渐渐显露出来了
这里为什么说是当在函数中而不是局部作用域时,要讲这个,首先我们要清楚function是什么
在javascript中,function作为js中的一个特殊对象:函数,是有着不同的形态的
我们通常看到的:
|
1
2
3
|
function set(){ var x = 0;}; |
在这一形态下,其内部的this是与全局作用域时一样,直接指向window,所以其形态 依然等价于window。
|
1
2
3
4
5
6
7
|
var x = 0;function num(){ this.x = 1;}console.log(this.x);//0num();console.log(this.x);//1 |
这里就是经常容易犯得错误,很多人觉得,当this已经在一个function之中时,其目前所处位置为当前的局部作用域,所以目前指向的应该是此函数
但是,如果你将这个函数实例化(new)之后,此函数将生成一个全新的环境,此时在此实例中的this也会随之发生变化,它将指向所在实例。
|
1
2
3
4
5
6
7
8
|
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, ...);
JavaScript中的this的指代对象详解的更多相关文章
- JavaScript中的apply和call函数详解(转)
每个JavaScript函数都会有很多附属的(attached)方法,包括toString().call()以及apply().听起来,你是否会感到奇怪,一个函数可能会有属于它自己的方法,但是记住,J ...
- javascript中parentNode,childNodes,children的应用详解
本篇文章是对javascript中parentNode,childNodes,children的应用进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 "parentNode&qu ...
- JavaScript中的apply和call函数详解
本文是翻译Function.apply and Function.call in JavaScript,希望对大家有所帮助 转自“http://www.jb51.net/article/52416.h ...
- JavaScript 中 Property 和 Attribute 的区别详解
property 和 attribute非常容易混淆,两个单词的中文翻译也都非常相近(property:属性,attribute:特性),但实际上,二者是不同的东西,属于不同的范畴. property ...
- JavaScript中数组Array.sort()排序方法详解
JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编 ...
- [原创]java WEB学习笔记38:EL 中的 11个 隐含对象 详解
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- HTML中 DOM操作的Document 对象详解(收藏)
Document 对象Document 对象代表整个HTML 文档,可用来访问页面中的所有元素.Document 对象是 Window 对象的一个部分,可通过 window.document 属性来访 ...
- Javascript中的url编码与解码(详解)
摘要 本文主要针对URI编解码的相关问题做了介绍,对url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript中和编解码相关的几对函数escape / unescap ...
- Javascript中的局部变量、全局变量的详解与var、let的使用区别
前言 Javascript中的变量定义方式有以下三种方式:1.直接定义变量,var与let均不写: a = 10; 2.使用var关键字定义变量 var a = 10; 3.使用let关键字定义变量 ...
随机推荐
- Mysql大数据备份和增量备份及还原
目前主流的有两个工具可以实现物理热备:ibbackup和xtrabackup ;ibbackup是需要授权价格昂贵,而xtrabackup功能比ibbackup强大而且是开源的 Xtrabackup提 ...
- MySQL的字符编码设置
-- 创建数据库时,设置数据库的编码方式 -- CHARACTER SET:指定数据库采用的字符集,utf8不能写成utf-8-- COLLATE:指定数据库字符集的排序规则,utf8的默认排序规则为 ...
- 在CentOS下安装crontab服务
1. 确认crontab是否安装: 执行 crontab 命令如果报 command not found,就表明没有安装 2. 安装 crontab 执行 yum install -y vixie-c ...
- zabbix客户端一键安装脚本
#!/bin/bash #通过命令行参数指定if [ ! -z "$1" ];then ip=$1 echo "手动指定IP:$ip"else#根据默认路由获取 ...
- 谈谈语音通信中的各种tone
今天谈的这个主题(tone)存在于我们的日常打电话过程中.先举两个场景:1,你拿起固话话筒准备打电话,按电话号码前先从话筒里听到"嗡"的连续音,这叫dial tone(拨号音,表示 ...
- Python 运算符,你了解多少?
新年新气象,文档更新继续~ 一.什么是运算符? 之前我们有定义过变量,变量是用来存储数据的,存储的数据是为了运算,运算就会使用到运算符 举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为 ...
- ASP.NET Core的身份认证框架IdentityServer4--(1)服务配置
官网文档地址:点我点我 准备 创建一个名为IdentityServer的ASP.NET Core Web Api 项目,端口5000 创建一个名为Api的ASP.NET Core Web Api 项目 ...
- 本地Git搭建并与Github连接
本地Git搭建并与Github连接 git 小结 1.ubuntu下安装git环境 ubuntu 16.04已经自带git ,可以通过下列命令进行安装与检测是否成功安装 sudo apt-get in ...
- Yii2中后台用前台的代码设置验证码显示不出来?
我说的是直接修改advanced模板.细心人会发现模板里在contact里有,登录也想要就仿照contact中的做法.前台好了,后台登录也要验证码,就把前台代码拿过来,可惜前后台的SiteContro ...
- Python 上下文管理器和else块
最终,上下文管理器可能几乎与子程序(subroutine)本身一样重要.目前,我们只了解了上下文管理器的皮毛--Basic 语言有with 语句,而且很多语言都有.但是,在各种语言中 with 语句的 ...