谈谈我对Javascript中This对象的理解

this 指针的隐式赋值

this总是指向调用该方法的对象;

在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window

 

显示操纵 this 指针

Javascript引擎通过以下两种方式允许我们显式指定this指针指代的对象:

1. 通过new操作符,Javascript引擎会将this指针返回给被赋值的变量。

2. 通过Function.apply或者Function.call或者Function.bind的原型方法,我们可以将this指针指代的对象以参数的形式传入,这个时候,函数内部使用的this指针就是传入的参数。

 

闭包中的 this 对象

this对象是在运行的时候基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window。但有时候由于编写闭包的方式不同,这一点可能不会那么明显。下面来看一个例子:

var name = "The Window";var obj = {name : "My Obj",getNameFunc : function(){return function(){return this.name;};}
}alert(obj.getNameFunc()()); //"The Window" (在非严格模式下)

以上代码先创建了一个全局变量 name,又创建了一个包含 name 属性的对象。这个对象还包含一个方法——getNameFunc(),它返回一个匿名函数,而匿名函数又返回 this.name。为什么这个匿名函数没有取得其外部作用于的 this 对象呢?每个函数在被调用时,其活动对象都会自动取得两个特殊变量: this 和 arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。不过,把外部作用于中德 this 对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了,如下所示:

var name = "The Window";var obj = {name : "My Obj",getNameFunc : function(){var that = this;return function(){return that.name;};}
}alert(obj.getNameFunc()()); //"My Object" 

 

在几种特殊情况下, this 的值可能会意外地改变。比如,下面的代码是修改前面例子的结果:

var name = "The Window";var obj = {name : "My Obj",getNameFunc : function(){return this.name;}
}
obj.getNameFunc(); //"My Object" 
(obj.getName)Func(); //"My Object" 
(obj.getNameFunc = obj.getNameFunc)(); //"The Window" ,在非严格模式下 

第三行代码先执行了一条赋值语句,然后再调用赋值后的结果。因为这个赋值表达式的值是函数本身,所以 this 的值不能得到维持(没有引用 obj,当前活动对象是 window),结果就返回了"The Window"。

 

转载于:https://www.cnblogs.com/ppJuan/p/6696321.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql获取下一条自增的id_mysql获取一个表中的下一个自增(id)值的方法

mysql获取一个表中的下一个自增(id)值的方法MySQL: Get next AUTO_INCREMENT value from/for tableNote to self: To get the next auto_increment value from a table run this query: SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA $dbName AND…

WebStorm 快捷键整理

我用的是WebStorm11 2016的版本,个人感觉非常不错,现在整理下快捷键。  Ctrl/ 或 CtrlShift/注释(// 或者/*…*/ )ShiftF6重构-重命名CtrlX剪切行CtrlD复制并粘贴行CtrlG查找行CtrlShiftUp/Down代码快向上/下移动。F2 或ShiftF2高…

mysql云数据库 磁盘利用率_云数据库MySQL参数的那些事儿

MySQL数据库参数是数据库系统运行的关键配置信息,设置不合适的参数值可能会影响业务。本文列举了一些重要参数说明,更多参数详细说明,请参见MySQL官网。修改敏感参数若干参数相关说明如下:“lower_case_table_names;”:云数据库默…

Swift3 Scanner用法之判断是否数字、提取字符串里的数字

1、判断是否数字 /// 判断是否是数字////// - Parameter string: <#string description#>/// - Returns: <#return value description#>class func isPurnInt(string: String) -> Bool {let scan: Scanner Scanner(string: string)var val:Int 0return scan.s…

mysql客户端查询_MySQL数据库之利用mysql客户端查询UCSC数据库

本文主要向大家介绍了MySQL数据库之利用mysql客户端查询UCSC数据库 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。UCSC Genome Browser是由University of California Santa Cruz (UCSC) 创立和维护的&#xff0c;该站点包含有人类、小…

算法交易系列研究之一

一、算法交易的概念 &#xff08;一&#xff09;什么是算法交易 算法交易&#xff08;Algorithmic Trading&#xff09;是一种程序化交易方式&#xff0c;它将交易者和市场有机地联系起来。算法交易通常可以减少这两者之间的摩擦&#xff0c;或者说在一定程度上可以降低交易对市…

mysql支持的时区列表_mysql按天分组支持时区

时区问题总是个比较麻烦的问题&#xff0c;客户端与服务器的时区不一致自然是理所当然的事情&#xff0c;而对于多台服务器或者分布式再或者炙手可热的云&#xff0c;时区不统一也很正常&#xff0c;而且也不需要统一&#xff0c;还好有个时间戳的概念&#xff0c;通过时间戳就…

IOS多线程之Block编程

1 什么是block iOS SDK 4.0開始&#xff0c;Apple引入了block这一特性。字面上说&#xff0c;block就是一个代码块。可是它的奇妙之处在于在内联(inline)运行的时候(这和C非常像)还能够传递參数。同一时候block本身也能够被作为參数在方法和函数间传递。这就给予了block无限的可…

python查找两个数组中相同的元素_匹配两个numpy数组以找到相同的元素

使用熊猫&#xff1a;import pandas as pdid1 pd.read_csv(id1.txt)id2 pd.read_csv(id2.txt)df id1.merge(id2.sort_values(byID2).drop_duplicates(ID2).rename(columns{ID2:ID1}))print(df)产生&#xff1a;^{pr2}$对于大型数据集&#xff0c;您可能需要执行以下操作&…

Spring3系列7- 自动扫描组件或Bean

原文地址 &#xfeff;&#xfeff;http://www.cnblogs.com/leiOOlei/p/3547589.html 一、 Spring Auto Scanning Components —— 自动扫描组件     1. Declares Components Manually——手动配置component 2. Auto Components Scanning——自动扫描组件 3…

数据插不进mysql_数据插入不进数据库里面去。

1&#xff1a;index.php提交到&#xff1a;index_ok.php2:连接数据库文件&#xff1a;conn.php<?php $idmysql_connect("localhost","root","root")ordie(连接失败:.mysql_error());if(mysql_select_db("db_databas...1&#xff1a;ind…

Android_Kotlin 代码学习

https://github.com/ldm520/Android_Kotlin_Demo转载于:https://www.cnblogs.com/simadi/p/6704864.html

liberty配置mysql数据源_Bluemix Liberty server.xml MySQL数据源配置

如果要连接到mysql数据库并希望 manually 在server.xml中提供凭据&#xff0c;则可以执行以下操作&#xff1a;server.xml中&#xff1a;URL"jdbc:mysql://1.2.3.4:3306/db"password"mypassword" user"admin" />name"MySQL Connector&qu…

CI Weekly #17 | flow.ci 支持 Java 构建以及 Docker/DevOps 实践分享

这周一&#xff0c;我们迫不及待写下了最新的 changelog —— 项目语言新增「Java」。创建 Java 项目工作流和其它语言项目配置很相似&#xff0c;flow.ci 提供了默认的 Java 项目构建流程模版&#xff0c;快去试试吧&#xff5e; 最近 flow.ci 2017 招聘计划正式启动&#xff…

mysql mgr 配置_MySQL5.7 MGR安装配置

MySQL5.7 MGR安装配置一、服务器规划mysql_mgr_01192.168.10.223mysql_mgr_02192.168.10.224mysql_mgr_03192.168.10.225二、配置文件1. mysql_mgr_01[rootmysql_mgr_01 tmp]# cat /etc/my.cnf[mysqld]sql_mode STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_D…

你让我怎么说

小组长分配任务,优化首页列表加载响应时间, 涉及更改一同事代码,遇到某个模型命名不解,UserInfoId和CurrentUserInfoId,问这两个干啥使, 答曰UserInfoId是用户的Id,CurrentUserInfoId不知道谁加的, 不解,问道"你写的方法你不知道?", 答曰,不知.后发现是另外一同事共…

python选取tensor某一维_Pytorch的Tensor操作(1)

类型推断torch.randn()&#xff1a;随机初始化a.type()&#xff1a;返回类型type()&#xff1a;返回基本类型isinstance() &#xff1a;检查类型cuda会影响数据类型标量维度(dimention)为0的标量标量的shape&#xff1a;返回类型为【】(空的list)&#xff0c;返回长度也为0a.di…

201521123014 《Java程序设计》第8周学习总结

201521123014 《Java程序设计》第8周学习总结 1. 本周学习总结 1.1 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结集合与泛型相关内容。 泛型&#xff08;编写的代码可被不同类型的对象所重用&#xff09; Java中一个集合可以放任何类型的对象&#xff0c;因为…

java remove all_如何使用Java List等集合类的removeAll方法

展开全部List等集合类的removeAll方法&#xff0c;API文档描述如下e69da5e6ba9062616964757a686964616f31333361303062&#xff1a;boolean removeAll(Collection> c)从列表中移除指定 collection 中包含的其所有元素(可选操作)。用法案例如下&#xff1a;List list1 new A…

【4.0】jdbcTemplate

1.什么是jdbcTemplate? 2.使用jdbcTemplate 3.crud操作 参考博文&#xff1a;http://blog.csdn.net/u014800380/article/details/64125653 4.采用配置文件的方式使用jdbcTemplate 参考博文&#xff1a;http://suyanzhu.blog.51cto.com/8050189/1563219/ 参考博文原文&#x…