关于箭头函数中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。
我自己试了一下丢给通义千问一次就给出了正确答案,不清楚你是怎么丢给AI的,但是我觉得回答的挺不错的了:
箭头函数定义在 foo 里,它里面的 this 就是 foo 的 this。
obj.foo() 的时候,foo 的 this 是 obj,不是 window
箭头函数没有this,再箭头函数里面访问this,你可以当做是访问一个变量,当前作用域没有this,会向上层作用域进行查找。
test里面访问this,这个this是指向foo中的this,单独运行foo,foo的this指向window,使用obj.foo运行foo,foo的this指向obj
在JavaScript中,箭头函数不绑定自己的this
,它捕获其所在(即包含它定义的)上下文(也称为词法作用域)的this
值作为自己的this
值。这意味着箭头函数中的this
值总是指向定义箭头函数的那个上下文中的this
。
在你的例子中,test
是一个箭头函数,它被定义在foo
函数内部。因此,test
箭头函数中的this
将引用foo
函数被调用时的this
。
让我们一步步分析代码:
当直接调用foo()
时:
foo
函数中的this
在严格模式下是undefined
(因为foo
是一个普通函数,且不是以任何对象的方法调用的),在非严格模式下,this
将指向全局对象(在浏览器中是window
)。test
是一个箭头函数,它的this
值捕获自其外部上下文,即foo
函数的this
。test()
时,它将打印出foo
函数中的this
值,即window
(在非严格模式下)。当调用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中的=>语
问题内容: 我在几个地方读到,主要的区别是“ 在箭头函数中按词法绑定”。一切都很好,但是我实际上不知道那意味着什么。 我知道这意味着它在定义函数主体的大括号范围内是唯一的,但是我实际上无法告诉您以下代码的输出,因为我不知道所指的是什么,除非它指的是胖箭头函数本身…。似乎没有用。 问题答案: 箭头函数捕获封闭上下文的值 因此,要直接回答您的问题,箭头函数内部的值将与分配箭头函数之前的值相同。