关于箭头函数中的this的指向

关于箭头函数中的this的指向普通函数中的 this 1 this 总是代表它的直接调用者 js 的 this 是执行上下文 例如 obj func 那么 func 中的 this 就是 obj2 在默认情况 非严格模式下 未使用 usestrict 没找到直接调用者 则 this 指的是 window 约定俗成 3 在严格模式下 没有直接调用者的函数中的 this 是 undefined4 使用 call apply bind ES5 新

普通函数中的this:

1. this总是代表它的直接调用者(js的this是执行上下文), 例如 obj.func ,那么func中的this就是obj

2.在默认情况(非严格模式下,未使用 ‘use strict’),没找到直接调用者,则this指的是 window (约定俗成)

3.在严格模式下,没有直接调用者的函数中的this是 undefined

4.使用call,apply,bind(ES5新增)绑定的,this指的是 绑定的对象

箭头函数中的this

1.箭头函数没有自己的this, 它的this是继承而来; 默认指向在定义它时所处的对象(宿主对象),此处指父级作用域,而不是执行时的对象, 定义它的时候,可能环境是window; 箭头函数可以方便地让我们在 setTimeout ,setInterval中方便的使用this

2.箭头函数中,this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。

例如这段函数中,this指向的是Person对象,可以看到控制台打印结果,此时的箭头函数所处的宿主对象是Person,所以this指向的是person

关于箭头函数中的this的指向关于箭头函数中的this的指向

看下面这段js代码,

关于箭头函数中的this的指向

此时的箭头函数所处的宿主对象是window对象,所以此处的this指向的是window。

关于箭头函数中的this的指向

再看下面这段代码,这是写在react中的一段箭头函数,这个箭头函数所处的对象是关于箭头函数中的this的指向MainForm这个类,所以在调用之后输出的就是MainForm这个对象

关于箭头函数中的this的指向

关于箭头函数中的this的指向

综上:箭头函数没有自己的this,它的this是继承而来,默认指向在定义它时所处的对象(宿主对象)。

下面看这样一段代码,非箭头函数,

关于箭头函数中的this的指向关于箭头函数中的this的指向

可以看到这里的this指向的是window对象,这是由于setInterval跟setTimeout调用的代码运行在与所在函数完全分离的执行环境上。这会导致这些代码中包含的 this 关键字会指向 window (或全局)对象。详细可参考MDN setTimeout MDN setInterval

下面我们做一个修改,将this存为一个变量,此时的this指向Person1,也可以使用bind函数来绑定this实现以下效果

关于箭头函数中的this的指向关于箭头函数中的this的指向

对于评论区的使用方式做一解释,

var s = 21; const obj = { s: 42, m: () => console.log(this.s), k: function(){console.log(this.s)} }; obj.m(); // 21 obj.k(); // 42

obj.m()  //21    是因为obj的m是箭头函数,箭头函数的this是定义时所处的对象,即它的父级作用域,所以此处是21

obj.k() // 42     普通函数,所以指向它的直接调用者,即obj调用k,所以this指向k,所以此处是42

其他有关this详解可参考这个博客:this指向详解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207068.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午2:31
下一篇 2026年3月19日 下午2:31


相关推荐

  • linux goland21.2.4激活【最新永久激活】

    (linux goland21.2.4激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月30日
    314
  • vi编辑时出现E325:ATTENTION(简单易懂,快速解决问题)「建议收藏」

    vi编辑时出现E325:ATTENTION(简单易懂,快速解决问题)「建议收藏」当出现这个问题时,是因为由于在编辑该文件的时候异常退出了,因为vim在编辑文件时会创建一个交换文件swapfile以保证文件的安全性。要想解决这个问题,1.找到开头前两行示例如下:E325:ATTENTIONFoundaswapfilebythename”/.local/share/nvim/swap//%home%dev%xuexi%tool%main.c.swp”(tips:复制标粗体的地方)2.找出name后面的文件路径以及名称,复制你的swap文件路径以及名

    2022年5月12日
    56
  • js数组删除某一个元素_删除数组中重复元素

    js数组删除某一个元素_删除数组中重复元素JS删除数组中某一个元素方式一:在Array原型对象上添加删除方法//查找指定的元素在数组中的位置 Array.prototype.indexOf=function(val){ for(vari=0;i<this.length;i++){if(this[i]==val){…

    2022年10月1日
    6
  • Spring加载resource时classpath*:与classpath:的区别

    Spring加载resource时classpath*:与classpath:的区别Spring 可以通过指定 classpath 与 classpath 前缀加路径的方式从 classpath 加载文件 如 bean 的定义文件 classpath 的出现是为了从多个 jar 文件中加载相同的文件 classpath 只能加载找到的第一个文件 比如 resource1 jar 中的 package com test rs 有一个 jarAppcontex xml 文件 内容如下

    2025年5月21日
    11
  • pta集合相似度_结构相似度

    pta集合相似度_结构相似度原题链接输入样例:33 99 87 1014 87 101 5 877 99 101 18 5 135 18 9921 21 3输出样例:50.00%33.33%#include<bits/stdc++.h>#define x first#define y second#define send string::nopsusing namespace std;typedef long long ll;const int N = 1e4 + 10;cons

    2022年8月8日
    7
  • java的spi机制_java编程思想第四版

    java的spi机制_java编程思想第四版What?SPI机制(ServiceProviderInterface)其实源自服务提供者框架(ServiceProviderFramework,参考【EffectiveJava】page6),是一种将服务接口与服务实现分离以达到解耦、大大提升了程序可扩展性的机制。引入服务提供者就是引入了spi接口的实现者,通过本地的注册发现获取到具体的实现类,轻松可插拔典型实例:jdbc的设…

    2025年8月24日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号