当前位置: 首页 > 知识库问答 >
问题:

javascript - 关于箭头函数中this的指向问题?

司马辉
2024-07-03

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

    <script>
        function foo() {
            const test = () => {
                console.log(this)
            }
            test()
        }
        foo()
        let obj = {
            a: 1,
        }
        obj.foo = foo
        obj.foo()
    </script>

在箭头函数中,this引用的是定义箭头函数的上下文。示例代码按理来说应该打印两次window,但结果是一次window,一次obj。

问了好多个AI,AI给的结果都是打印两次window。

共有4个答案

卫建义
2024-07-03

我自己试了一下丢给通义千问一次就给出了正确答案,不清楚你是怎么丢给AI的,但是我觉得回答的挺不错的了:
image.png

白越
2024-07-03

箭头函数定义在 foo 里,它里面的 this 就是 foo 的 this。

obj.foo() 的时候,foo 的 this 是 obj,不是 window

张权
2024-07-03

箭头函数没有this,再箭头函数里面访问this,你可以当做是访问一个变量,当前作用域没有this,会向上层作用域进行查找。

test里面访问this,这个this是指向foo中的this,单独运行foo,foo的this指向window,使用obj.foo运行foo,foo的this指向obj

澹台逸明
2024-07-03

在JavaScript中,箭头函数不绑定自己的this,它捕获其所在(即包含它定义的)上下文(也称为词法作用域)的this值作为自己的this值。这意味着箭头函数中的this值总是指向定义箭头函数的那个上下文中的this

在你的例子中,test是一个箭头函数,它被定义在foo函数内部。因此,test箭头函数中的this将引用foo函数被调用时的this

让我们一步步分析代码:

  1. 当直接调用foo()时:

    • foo函数中的this在严格模式下是undefined(因为foo是一个普通函数,且不是以任何对象的方法调用的),在非严格模式下,this将指向全局对象(在浏览器中是window)。
    • 由于test是一个箭头函数,它的this值捕获自其外部上下文,即foo函数的this
    • 因此,当调用test()时,它将打印出foo函数中的this值,即window(在非严格模式下)。
  2. 当调用obj.foo()时:

    • 尽管foo被设置为obj对象的一个属性,但是当我们以这种方式调用函数时(即对象的方法),通常函数内部的this会指向该对象(除非函数被显式地绑定到另一个this值或使用箭头函数)。但是,foo中的test是一个箭头函数,所以test中的this不会指向obj
    • 如上所述,test中的this值捕获自foo函数,而foo函数被调用时,它的this(在非严格模式下)仍然是window(因为foo函数本身没有被绑定到obj)。
    • 因此,当通过obj.foo()调用test()时,它同样会打印出window(在非严格模式下)。

所以,无论哪种情况,test箭头函数中的this都会指向window(在非严格模式下)。

如果你的代码是在严格模式下运行的(即在<script>标签中添加"use strict";),那么第一次调用foo()时,this将是undefined(在foo函数中),但是由于你尝试打印this,它会抛出一个错误,因为undefined没有console.log方法。

但是,基于你给出的代码(非严格模式),答案是两次都会打印window

 类似资料:
  • 本文向大家介绍箭头函数中this指向举例?相关面试题,主要包含被问及箭头函数中this指向举例?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: //输出22 定义时绑定。

  • 在这里,箭头函数中的这个关键字指向obj的变量环境 null null null null

  • 本文向大家介绍深入理解Javascript箭头函数中的this,包括了深入理解Javascript箭头函数中的this的使用技巧和注意事项,需要的朋友参考一下 首先我们先看一段代码,这是一个实现倒数功能的类「Countdown」及其实例化的过程: 运行这段代码时,将会出现异常「this._step is not a function」。 这是Javascript中颇受诟病的「this错乱」问题:s

  • 问题内容: class App extends Component { constructor(props) { … } 在类中声明的两种函数 (onChange和onSubmit) 之间有什么区别?如果我将其声明为ES6类方法,但在 const url中 引用this.sate时出现错误,但是将其更改为arrow函数可以解决此问题。 我想知道两种情况下如何正确处理“ this” 另外,我该如何做

  • 本文向大家介绍JavaScript ES6箭头函数使用指南,包括了JavaScript ES6箭头函数使用指南的使用技巧和注意事项,需要的朋友参考一下 胖箭头函数(Fat arrow functions),又称箭头函数,是一个来自ECMAScript 2015(又称ES6)的全新特性。有传闻说,箭头函数的语法=>,是受到了CoffeeScript 的影响,并且它与CoffeeScript中的=>语

  • 问题内容: 我在几个地方读到,主要的区别是“ 在箭头函数中按词法绑定”。一切都很好,但是我实际上不知道那意味着什么。 我知道这意味着它在定义函数主体的大括号范围内是唯一的,但是我实际上无法告诉您以下代码的输出,因为我不知道所指的是什么,除非它指的是胖箭头函数本身…。似乎没有用。 问题答案: 箭头函数捕获封闭上下文的值 因此,要直接回答您的问题,箭头函数内部的值将与分配箭头函数之前的值相同。

  • 本文向大家介绍JavaScript中的常规函数​​与箭头函数?,包括了JavaScript中的常规函数​​与箭头函数?的使用技巧和注意事项,需要的朋友参考一下 常规函数与箭头函数 一个箭头函数来简洁编写代码。常规 函数和箭头 函数的工作方式相似,但是它们之间存在一些差异。让我们简要地讨论一下这些差异。 箭头函数的语法 正则函数的语法 “ this”关键字的用法 它不能在箭头功能中使用“ this”

  • 本文向大家介绍Javascript中this关键字指向问题的测试与详解,包括了Javascript中this关键字指向问题的测试与详解的使用技巧和注意事项,需要的朋友参考一下 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象。Javascript可以通过一定的设计模式来实现面向对象的编程,其中this “指针”就是实现面向对