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对象的理解相关推荐

  1. 创建健壮的isArray()函数(JavaScript中判断对象类型的种种方法)

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  2. 在JavaScript中删除对象

    本文翻译自:Deleting Objects in JavaScript I'm a bit confused with JavaScript's delete operator. 我对JavaScr ...

  3. 如何在Javascript中访问对象的第一个属性?

    本文翻译自:How to access the first property of an object in Javascript? Is there an elegant way to access ...

  4. 检查值是否是JavaScript中的对象

    如何检查值是否是JavaScript中的Object? #1楼 尝试这个 if (objectName instanceof Object == false) {alert('Not an objec ...

  5. Javascript中的对象和原型(一)(转载)

    面向对象的语言(如Java)中有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,JavaScript 没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. 要了解面向对象,首 ...

  6. name optimize is not defined 怎么解决_Web前端:怎么在JavaScript中比较对象?

    大家好,我来了,本期为大家带来的前端开发知识是"Web前端:怎么在JavaScript中比较对象?",有兴趣做前端的朋友,一起来看看吧! 比较JavaScript中的原始值很简单. ...

  7. Javascript中的对象查找【转】

    编辑点评:本文作者为大家介绍Javascript中的对象查找一些问题,希望有所帮助. 近期群里常有人提一些简单的问题,比如发一段代码乱七八糟的代码,然后说里面某个变量是什么,比如这里就有个很好的例子: ...

  8. JavaScript 中的对象拷贝(深拷贝、浅拷贝)

    对象是 JavaScript 的基本块.对象是属性的集合,属性是键值对.JavaScript 中的几乎所有对象都是位于原型链顶部 Object 的实例. 介绍 如你所知,赋值运算符不会创建一个对象的副 ...

  9. JavaScript 中遍历对象的属性

    原文链接 JavaScript 中遍历对象的属性 参考 JavaScript中的属性:如何遍历属性 <JavaScript 高级程序设计> 概述 遍历 JavaScript 对象中的属性没 ...

最新文章

  1. 【视频开发】图像清晰度评价方法
  2. Azure CosmosDB (3) 选择适当的一致性级别
  3. HQL查询(分页查询,动态sql查询,参数查询)
  4. bzoj1601【Usaco2008 Oct】灌水
  5. CSS实战经验:灵活运行注释带来的益处(转载)
  6. caffe在线可视化(转)
  7. MySQL 基础————常用数据类型
  8. python的集成开发环境搭建_Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细)...
  9. Mongoose介绍和入门​​
  10. windows linux—unix 跨平台通信集成控制系统----系统硬件信息获取
  11. 有人说赚钱靠项目,也有人说赚钱靠技术
  12. java容器取交集、并集、补集、差集示例
  13. eclipse订制快捷键
  14. 启动计算机实现5秒开机,win10提高开机速度的设置教程 电脑五秒开机优化步骤...
  15. 彻底带你入门RDS数据库「玩转华为云」
  16. Sublime Text 3 -mac版简体中文汉化教程
  17. 若某非空二叉树的先序序列和后序序列正好相反,或者正好相同,则二叉树形态是怎么样的?
  18. 整理几个国内外常用的广告联盟给大家参考
  19. (1)1999~2021 年中国城市统计年鉴面板数据(含地级市面板、县级市面板和主要指标)(2)香港统计年刊(3)第一到第七次的人口普查数据(4)全国省市县-五六七普人口数据(5)国际统计年鉴
  20. wps右边的标记区域怎么去掉,wpsword右边的标记区域怎么去掉

热门文章

  1. 特征工程之数据预处理(下)
  2. ListString^^ 引用空间
  3. 做小程序的流程总结(基本篇)
  4. Plist文件和字典转模型
  5. Java poi读取,写入Excel2003
  6. windows下eclipse搭建android_ndk开发环境
  7. JS 字符串编码函数(解决URL特殊字符传递问题):escape()、encodeURI()、encodeURIComponent()区别详解...
  8. 小议传统分层与新式分层,抑或与DDD分层
  9. FutureTask isDone 返回 false
  10. springboot mybatis-plus 配置 yml 、druid 配置 yml 、mybatis-plus 代码生成