要点

this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象。

this指向的三种情况

情况1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window,而是指向调用函数的对象实例,这种函数中的this等于undefined。

function a(){var user = "维他奶";console.log(this);//windowconsole.log(this.user);//undefined}//windonw是全局对象,所有的全局变量都是对象的属性.//a()<=>window.a()a();console.log(window);console.log(window.user);//根本没有user这个属性。只有一个name="";

运行结果

严格模式,请参照https://segmentfault.com/a/11...
严格模式下定义变量必须使用var。否则报错.
在严格模式下,对象的函数中的this指向调用函数的对象实例
同样道理,可以推断出,在严格模式下,构造函数中的this指向构造函数创建的对象实例。

"use strict";//开启严格模式function a(){var user = "维他奶";//在严格模式下,对象的函数中的this指向调用函数的对象实例console.log(this);//a{}console.log(this.user);//undefined}var A = new a(); 

运行结果

情况2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。

var sum = {a:10,b:{a:12,fn:function(){console.log(this.a);//12}}}sum.b.fn();

运行结果

情况3:如果一个函数中有this,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象.

var sum = {a:10,b:{// a:12,fn:function(){console.log(this.a);//undefined}}}sum.b.fn();

运行结果

注意事项
尽管对象b中没有属性a,这个this指向的也是对象b,因为this只会指向它的上一级对象,不管这个对象中有没有this要的东西。

情况4:this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的,情况4中虽然函数fn是被对象b所引用,但是在将fn赋值给变量num的时候并没有执行所以最终指向的是window,这和情况3是不一样的,情况3是直接执行了fn。

var sum = {a1:10,b:{a:12,fn:function(){console.log(this.a1);//undefinedconsole.log(this);//window}}}var num = sum.b.fn;num();

运行结果

构造函数的this指向:

function A(){this.name = "维他奶";}var a = new A();console.log(a.name);//维他奶

运行结果

new关键字到底做了什么?
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);原理:自动调用apply方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。
(3) 执行构造函数中的代码(为这个新对象添加属性);
(4) 返回新对象。

return 会把new创建的this覆盖.
如果返回值是复杂数据类型,那么this指向的就是那个返回的对象,如果返回值不是复杂数据类型那么this还是指向函数的实例。

    function A(){this.name = "维他奶";return 1;}var a = new A();console.log(a.name);//维他奶function A(){this.name = "维他奶";return ;}var a = new A();console.log(a.name);//维他奶function A(){this.name = "维他奶";return function(){};}var a = new A();//传入空函数,所以输出一个空,而不是undefinedconsole.log(a.name);//""function A(){this.name = "维他奶";return null;}var a = new A();console.log(a.name);//维他奶

简单数据类型:string,boolean,number,undefined,null,NaN
复杂数据类型: Object,Function,Array,String,Boolean,Number
其中String,Boolean,Number,是自带的封装好的方法。
简单数据类型存放在内存的栈中,而复杂数据类型存放在内存的堆中,把地址存放在内存的栈中,先获取地址,再读取堆中数据。

理解学习this指向问题相关推荐

  1. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   C ...

  2. selenium 学习之路开始了,一遍搬一遍理解学习,加油!!!

    selenium 学习之路开始了,一遍搬一遍理解学习,加油!!! 转载于:https://www.cnblogs.com/jueshilaozhongyi/p/8418652.html

  3. MySQL索引的理解学习,面试不问索引原理就是事务原理

    目录 MySQL执行SQL的整体流程 引言, MySQL索引底层学习原因 磁盘介绍(理解磁盘IO) 索引底层数据结构B+树 B+树(聚集索引) B+树(辅助索引) 思考一下为何使用B+树结构, 不是B ...

  4. java 父类引用子类对象_java多态,如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   C ...

  5. 如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat ...

  6. 深入理解学习Git工作流

    2019独角兽企业重金招聘Python工程师标准>>> 个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心 ...

  7. 深入理解python.md_深入理解学习Git工作流(git-workflow-tutorial)

    个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心中的困惑迎刃而解,于是我将这部分资料进行整理放到了github上,欢迎st ...

  8. (pytorch-深度学习系列)ResNet残差网络的理解-学习笔记

    ResNet残差网络的理解 ResNet伴随文章 Deep Residual Learning for Image Recognition 诞生,该文章是MSRA何凯明团队在2015年ImageNet ...

  9. java父类引用子类_java多态,如何理解父类引用指向子类对象

    要理解多态性,首先要知道什么是"向上转型". 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求 ...

最新文章

  1. SMS2003 SP3+SQL Server2000 SP4部署(下)
  2. MySQL数据库乱码 - Linux下乱码问题解决
  3. 笔记-信息化与系统集成技术-信息资源管理
  4. Python自动化办公之Excel拆分并自动发邮件
  5. bzoj 1699: [Usaco2007 Jan]Balanced Lineup排队【st表||线段树】
  6. 两个企业级产品设计思路:流程效率指标功能生命周期长度
  7. 目标检测——夏侯南溪目标检测模型之输出信息显示
  8. git命令——git commit
  9. Android Clipboard(复制/剪贴板)
  10. SQL:postgresql将查询结果拼接起来
  11. c++ 工厂模式_Java面试专题之五:设计模式学习,详细分析工厂方法模式
  12. 在线图片编辑器/在线视频剪辑器/网站源码
  13. 注入器/injector
  14. 架构师之路(二)-概念架构
  15. 构造图片木马,绕过文件内容检测上传木马
  16. 计算机中重命名的英文单词,重命名是什么意思
  17. C语言字符串的组包解包
  18. NAS 详细搭建方案 - 安装Windows Server
  19. CSS开发技巧实用记(一)
  20. linux ubuntu安装教程6,1.1.6 安装 Linux(Ubuntu)下的 Mixly

热门文章

  1. 使用spring + ActiveMQ 总结
  2. (转)winform下TCP通信的简单应用
  3. 闲诗一首:《扬州即行》
  4. NTFS 分区表修复新法(AcronisDiskDirector10)
  5. lzg_ad:使用Virtual PC 部署和测试XP Embedded 发布镜像
  6. EXCEL公式、函数、图表应用技巧800问
  7. Django 框架13: 自定义过滤器和标签
  8. VUE中使用sass
  9. 操纵BGP AS-PATH 属性案例(配图+详细验证过程)
  10. MyBatis入门学习教程-调用存储过程