谈谈我对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
谈谈我对Javascript中This对象的理解相关推荐
- 创建健壮的isArray()函数(JavaScript中判断对象类型的种种方法)
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- 在JavaScript中删除对象
本文翻译自:Deleting Objects in JavaScript I'm a bit confused with JavaScript's delete operator. 我对JavaScr ...
- 如何在Javascript中访问对象的第一个属性?
本文翻译自:How to access the first property of an object in Javascript? Is there an elegant way to access ...
- 检查值是否是JavaScript中的对象
如何检查值是否是JavaScript中的Object? #1楼 尝试这个 if (objectName instanceof Object == false) {alert('Not an objec ...
- Javascript中的对象和原型(一)(转载)
面向对象的语言(如Java)中有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,JavaScript 没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. 要了解面向对象,首 ...
- name optimize is not defined 怎么解决_Web前端:怎么在JavaScript中比较对象?
大家好,我来了,本期为大家带来的前端开发知识是"Web前端:怎么在JavaScript中比较对象?",有兴趣做前端的朋友,一起来看看吧! 比较JavaScript中的原始值很简单. ...
- Javascript中的对象查找【转】
编辑点评:本文作者为大家介绍Javascript中的对象查找一些问题,希望有所帮助. 近期群里常有人提一些简单的问题,比如发一段代码乱七八糟的代码,然后说里面某个变量是什么,比如这里就有个很好的例子: ...
- JavaScript 中的对象拷贝(深拷贝、浅拷贝)
对象是 JavaScript 的基本块.对象是属性的集合,属性是键值对.JavaScript 中的几乎所有对象都是位于原型链顶部 Object 的实例. 介绍 如你所知,赋值运算符不会创建一个对象的副 ...
- JavaScript 中遍历对象的属性
原文链接 JavaScript 中遍历对象的属性 参考 JavaScript中的属性:如何遍历属性 <JavaScript 高级程序设计> 概述 遍历 JavaScript 对象中的属性没 ...
最新文章
- 【视频开发】图像清晰度评价方法
- Azure CosmosDB (3) 选择适当的一致性级别
- HQL查询(分页查询,动态sql查询,参数查询)
- bzoj1601【Usaco2008 Oct】灌水
- CSS实战经验:灵活运行注释带来的益处(转载)
- caffe在线可视化(转)
- MySQL 基础————常用数据类型
- python的集成开发环境搭建_Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细)...
- Mongoose介绍和入门​​
- windows linux—unix 跨平台通信集成控制系统----系统硬件信息获取
- 有人说赚钱靠项目,也有人说赚钱靠技术
- java容器取交集、并集、补集、差集示例
- eclipse订制快捷键
- 启动计算机实现5秒开机,win10提高开机速度的设置教程 电脑五秒开机优化步骤...
- 彻底带你入门RDS数据库「玩转华为云」
- Sublime Text 3 -mac版简体中文汉化教程
- 若某非空二叉树的先序序列和后序序列正好相反,或者正好相同,则二叉树形态是怎么样的?
- 整理几个国内外常用的广告联盟给大家参考
- (1)1999~2021 年中国城市统计年鉴面板数据(含地级市面板、县级市面板和主要指标)(2)香港统计年刊(3)第一到第七次的人口普查数据(4)全国省市县-五六七普人口数据(5)国际统计年鉴
- wps右边的标记区域怎么去掉,wpsword右边的标记区域怎么去掉
热门文章
- 特征工程之数据预处理(下)
- ListString^^ 引用空间
- 做小程序的流程总结(基本篇)
- Plist文件和字典转模型
- Java poi读取,写入Excel2003
- windows下eclipse搭建android_ndk开发环境
- JS 字符串编码函数(解决URL特殊字符传递问题):escape()、encodeURI()、encodeURIComponent()区别详解...
- 小议传统分层与新式分层,抑或与DDD分层
- FutureTask isDone 返回 false
- springboot mybatis-plus 配置 yml 、druid 配置 yml 、mybatis-plus 代码生成