this总是指向函数的直接调用者(而非间接调用者)
如果有new关键字,this指向new出来的那个对象
在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window

this是函数运行时自动生成的一个内部对象,只能在函数内部使用,但总指向调用它的对象。
通过以下几个例子加深对this的理解。
(1)作为函数调用

var name = 'Jenny';
function person() {return this.name;
}
console.log(person());  //Jenny

上面这个例子在全局作用域中调用person(),此时的调用对象为window,因此this指向window,在window中定义了name变量,因此this.name相当于window.name,为Jenny。
再看下面一个例子:

function a() {function b() {function c() {console.log(this);}c();}b();
}
a();    // window

这个例子中,也同为函数调用,因此this指向window。
(2)作为对象的方法调用

var name = 'Jenny';
var obj = {name: 'Danny',person: function() {return this.name;}
};
console.log(obj.person());  //Danny

在这个例子中,person()函数在obj对象中定义,调用时是作为obj对象的方法进行调用,因此此时的this指向obj,obj里面定义了name属性,值为Danny,因此this.name = “Danny”。

(3)作为构造函数调用
作为构造函数调用和普通函数调用的区别是,构造函数使用new关键字创建一个实例,此时this指向实例对象。

function person() {return new person.prototype.init();
}
person.prototype = {init: function() {return this.name;},name: 'Brain'
};
console.log(person().name); //undefined

这是一个比较复杂的例子,涉及到了原型。
首先,创建构造函数person,为函数重新定义原型,在原型上定义了两个方法init和name,其中init返回this.name。
调用person函数的name属性,发现返回的是undefined,为什么不是Brain呢?
我们看,调用person,返回person.prototype.init()的一个实例,假设返回的这个实例名为a,那么此时的this指向的就是a,a作为person.prototype.init()的一个实例,那么所有定义在person.prototype.init()中的方法等都可以被a调用,但是name属性定义在person的原型中,而非init函数中,因此返回undefined。

(4)apply和call
使用apply()和call()可以改变调用函数的对象,第一个参数为改变后调用这个函数的对象,其中apply()的第二个参数为一个数组,call的第二个参数为每个参数。
function person() {
return this.name;
}
var obj = {
name: ‘Jenny’,
age: 18
};
console.log(person.apply(obj)); //Jenny

使用apply函数改变了调用person的对象,是在obj对象下面调用person,不再是在window对象下调用了,因此this指向obj,this.name = “Jenny”;

谈谈This对象的理解相关推荐

  1. 谈谈对this对象的理解?

    1.this 关键字含义是什么? 解答:this总是返回一个对象,this就是属性或方法"当前"所在对象.由于对象的属性可以赋值给另一个对象,所以属性所在的当前对象是可变的,即th ...

  2. 后处理程序文件大小的变量_【每日一题】(17题)面试官问:JS中事件流,事件处理程序,事件对象的理解?...

    关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 2020,实「鼠」不易 2021,「牛」转乾坤 风劲潮涌当扬帆,任重道远须奋蹄! 一.前言 2020.12.23 立 ...

  3. Java面试之谈谈对Volatile的理解

    谈谈对Volatile的理解 Volatile在日常的单线程环境是应用不到的 Volatile是Java虚拟机提供的轻量级的同步机制(三大特性) 保证可见性 不保证原子性 禁止指令重排 可能这么说,还 ...

  4. 谈谈对this的理解

    谈谈对this的理解 什么是this 每个函数在被调用时都会创建一个执行上下文,这个上下文包含了变量环境.this.作用域链等,this就是执行上下文中的一个属性,他是在函数运行时进行绑定的,this ...

  5. 什么是面向对象?谈谈对面向对象的理解?

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.什么是面向对象?谈谈对面向对象的理解? 二.3大特征: 1.封装: 2.继承: 2.多态: 总结 一.什么是面向对象?谈 ...

  6. 我对javascript对象的理解

    前言 JavaScript这门语言除了基本类型都是对象,可以说JavaScript核心就是对象,因此理解JavaScript对象及其种种特性至关重要,这是内功.本文介绍了我对es5对象,原型, 原型链 ...

  7. 谈谈对MVVM的理解

    谈谈对MVVM的理解 什么是MVVM 不管是MVC,MVP,或者MVVM,都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式 ...

  8. 学习笔记之——Python中类和对象的理解

    学习笔记之--Python中类和对象的理解 面向对象的含义和特性 类 Python中类的定义.结构.创建 Python类的定义 Python类的结构 类的创建 类的属性 类的方法 对象 对象的创建 参 ...

  9. 面向对象2(构造函数、实例对象、原型对象——关系理解)

    参考解释: 对象原型 构造函数与实例对象 构造函数与实例对象 关系: 实例对象是通过构造函数来创建的,创建的过程叫实例化. 示例代码: //1.自定义构造函数 function Person(name ...

  10. 谈谈我对面向对象以及类与对象的理解

    对于刚接触JAVA或者其他面向对象编程语言的朋友们来说,可能一开始都很难理解面向对象的概念以及类和对象的关系. 面向对象 首先,一言不和先百度,得到如下定义: 一切事物皆对象,通过面向对象的方式,将现 ...

最新文章

  1. CodeForces - 844B Rectangles
  2. Windows 下配置Apache+MySql+PHP环境(原创)
  3. C#——自定义泛型链表DEMO
  4. 京东云端到端多媒体关键技术揭秘
  5. 面向对象编程设计模式--简单工厂模式讲解(历史上最简单明白的例子)
  6. Redis数据结构之有序集合
  7. matlab 度表示,在matlab中,单精度类型用关键字()表示,双精度类型用关键字()表示...
  8. Java Iterable类
  9. 如何用C#+WinRAR 实现压缩 分类:
  10. 拓端tecdat|R语言进行相关矩阵分析及其网络可视化
  11. java web js 创建文件夹_如何在web工程里用java代码用程序动态添加css,images,js等文件夹...
  12. 微信能通过服务器改数据解封吗,【微信新规】微信永久封号官方解封方法
  13. 海外:国外最受欢迎的5个电子邮件服务网站
  14. 《我的第一本思维导图》读书笔记
  15. 记在拿到cvte的offer之后
  16. 移动端 懒加载、下拉刷新、上拉加载
  17. 关于养猫的简单经验教训
  18. 今天获取的云蹦迪直播软件源码全开源
  19. win10 乳白色风格_乳白奥运
  20. 根据WebService地址展示方法列表、入参和返回值(解析wsdl)

热门文章

  1. 统帅转型:轻时尚时代挺进年轻领地
  2. python制作口算表
  3. linux中解压文件到root,linux(centos8):使用zip/unzip压缩和解压缩文件
  4. macbookair有没有touchbar_高配MacBook Air和低配MacBook Pro选哪个?
  5. JS Worker执行多线程
  6. JavaScriptnbsp;的学习程序整理(…
  7. 智遥工作代理问题解析
  8. Unity-存档与读档
  9. html与python_Python和显示HTML
  10. Matplotlib折线图(绘图实例+代码详解)