1.前言

在JavaScript中,this的指向一直是大多数初学者的易错点,总是搞不清楚this到底指向谁,而在求职面试中,this的指向问题往往又是高频考点。本篇博文就来总结一下在JavaScript中不同情况下this到底指向谁。

2.热身一下

首先,我们先来看看下面的代码,请问,下面这段代码运行后会在控制台输出什么?如果你能马上回答出程序输出的结果,那么你已经很清楚this的指向了,不用再往下看了。

 var bar = 2;
var obj = {
bar: 1,
foo: function () {
console.log(this.bar)
},
boo: (function () {
console.log(this.bar)
})()
}; var foo = obj.foo; obj.foo()
foo()

运行输出结果:

通过分析代码,我们可以知道,第一个2是在第8行代码处输出的,第二个1是在第14行代码处输出的,第三个2是在第15行代码处输出的。这样的结果显然是由于不同地方的this指向不同,导致此this.bar非彼this.bar。那么到底该怎么区分不同情况下的this到底指向谁呢?下面我们就来总结下在JavaScript中几种不同情况下的this指向问题,只要记住了以下五种情况,保准你以后遇到这样的面试题不再懵圈,哈哈哈哈哈。

3.情况一:自执行函数

//自执行函数
boo: (function () {
console.log(this.bar) //输出2
})()

在上面的热身代码中,boo函数是一个自执行函数,也就是说当浏览器运行这段代码时,会先自动执行boo函数。切记:自执行函数里面的this指向window全局对象。既然this指向了window,那么this.bar即就是window.bar,所以在该行代码处输出2.

4.情况二:函数调用模式

foo: function () {
  console.log(this.bar) //输出2
},
foo() // 函数调用模式

在形如热身代码中第15行这样的单纯的函数调用时,那么切记:在单纯的函数调用模式中,被调用函数内部的this指向window全局对象。所以this.bar即就是window.bar,在该行代码处输出2.

5.情况三:方法调用模式

var obj = {
bar: 1,
foo: function () {
console.log(this.bar) //输出1
}
};
obj.foo() // 方法调用模式

在形如obj.foo()这种,对象.方法这种模式我们称为方法调用模式,在这种模式中,this指向调用这个方法的对象。在热身代码中,由于foo函数是被obj.foo()这种方式调用的,那么foo函数内的this就指向了obj,因此this.bar即就是obj.bar,所以在该行代码处输出1。

Tips:关于情况二和情况三,我们可以简单粗暴的这么记:函数执行的时候,看函数名前面是否有".",有的话"."前面是谁this就指向谁,没有的话this就指向window全局对象

6.情况四:构造函数调用模式

这种情况最容易理解,在使用构造函数实例化对象时,构造函数中的this指向实例化出来的新对象。

function Person(name){
this.name = name
console.log(this) //输出xiaoming
} xiaoming = new Person('xiaoming')

7.情况五:apply/call改变this指向

apply和call这两个方法,可以修改函数调用上下文,也就是this的指向。call和apply的区别如下:

  • apply  

    函数.apply(对象, 函数需要参数列表,是一个数组)

  • call

    函数.call(对象,函数所需要的参数1,参数2,参数3...参数n)

1.第一个参数都是要把this修改指向的对象

2.当函数需要参数的时候,那么apply是用数组进行参数的传递,而call是使用单个的参数进行传递

3.apply和call方法第一个传入参数是null的时候都表示为函数调用模式,也就是将this指向window

对于这种情况,我们只需看函数的第一个参数是谁this就指向谁,如果是null,则指向window全局对象。

8.总结

了解了以上五种情况,再回头去看热身代码,是不是就清楚多了?O(∩_∩)O哈哈~

javaScript中this到底指向谁的更多相关文章

  1. Javascript中的this指向。

    一.JavaScript中的函数 在了解this指向之前,要先弄明白函数执行时它的执行环境是如何创建的,这样可以更清楚的去理解JavaScript中的this指向. function fn(x,y,n ...

  2. 前端面试之JavaScript中this的指向【待完善!】

    JavaScript中this的指向问题! 另一个特殊的对象是 this,它在标准函数和箭头函数中有不同的行为. 在标准函数中, this 引用的是把函数当成方法调用的上下文对象,这时候通常称其为 t ...

  3. javascript中this的指向

    作为一个前端小白在开发中对于this的指向问题有时候总是会模糊,于是花时间研究了一番. 首先this是JS的关键字,this是js函数在运行是生成的一个内部对象,生成的这个this只能在函数内部使用. ...

  4. JavaScript中 this 的指向

    很多人都会被JavaScript中this的指向(也就是函数在调用时的调用上下文)弄晕,这里做一下总结: 首先,顶层的this指向全局对象. 函数中的this按照调用方法的不同,其指向也不同: 1.函 ...

  5. javascript中的this指向问题

    在深入学习JavaScript之后,我们越来越多的会遇到函数或者在对象内部中,对于this的指向问题的疑惑,其实基本上每一个编程语言中都有一个this,这个this的指向都是大同小异,你也可以汉化它的 ...

  6. 面试题-浅谈JavaScript中的This指向问题

    各位小伙伴在面试中被面试官问道this指向问题一定不少吧,同时还被问道apply,call和bind的用法区别,现在,就来简单的聊一聊this到底指向何方. 1.基本概念 MDN的官方解释:与其他语言 ...

  7. JavaScript中的this指向规则

    首先,JavaScript的this指向问题并非传说中的那么难,不难的是机制并不复杂,而被认为不好理解的是逻辑关系和容易混淆的执行上下文.这篇博客也就会基于这两个不好理解的角度来展开,如要要严格的来对 ...

  8. 灵活的理解JavaScript中的this指向(一)

    this是JavaScript中的关键字之一,在编写程序的时候经常会用到,正确的理解和使用关键字this尤为重要.首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确 ...

  9. JavaScript中this指针指向的彻底理解

    this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象 这一点与函数中自由变量Action-varibal不同 var ...

随机推荐

  1. python基本数据类型及常用功能

    1.数字类型 int -int(将字符串转换为数字) a = " print(type(a),a) b = int(a) print(type(b),b) num = " v = ...

  2. Java BIO及实现

    发现日常学习过的知识不久就会遗忘,在此只是整理并记录一下学习笔记,做个回忆,并方便以后查阅,若有错误,欢迎指正 网络模型:TCP/IP网络模型是从OSI七层模型中演化来的,osi模型分为物理层,数据链 ...

  3. 题解:2018级算法第二次上机 Zexal的竞赛

    题目描述: 样例: 实现解释: 一道需要一点思考的动态规划题目 知识点:动态规划,数据记录 首先将题目描述调整:分别输入不同分数的题目总分(便于后续计算),当获得了i分数的总分后无法获得i-1和i+1 ...

  4. Java学习笔记之封装与继承

    封装 1,将属性定义为私有的(private)   不能通过  对象名.属性  来直接访问,但是可以通过方法来间接的访问, 2,封装的意义:公有属性可以被随意修改,并且不能被程序察觉.封装后,别人通过 ...

  5. Neo4j:图数据库GraphDB(三)创建删除及高级操作

    本片继续前几篇介绍图数据库的创建,有疑问可以我的看看前两篇文章:http://www.cnblogs.com/rongyux/p/5537206.html 四 图数据库的创建 1 创建一个节点   P ...

  6. MySQL 插入记录时自动更新时间戳

    将字段设置成timestamp类型,同时默认值设置成 CURRENT_TIMESTAMP.

  7. TensorFlow2.0(9):TensorBoard可视化

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  8. Java NIO之Java中的IO分类

    前言 前面两篇文章(Java NIO之理解I/O模型(一).Java NIO之理解I/O模型(二))介绍了,IO的机制,以及几种IO模型的内容,还有涉及到的设计模式.这次要写一些更贴近实际一些的内容了 ...

  9. 将windows项目移植到linux上

    提要:由于项目使用java开发,移植中没有什么编译问题(移植很快,但小问题多) 1.移植过程中遇到的问题: (1).由于项目中使用了 1024以下的端口号,导致网络通信一直出错 原因:因为Linux要 ...

  10. markdown语法(转)

    markdown语法 1.标题代码 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 2.引用代码 >你好 >> 您好 ...