胖箭头或带有此关键字 [duplicate] 的 function()

Fat arrow or function() with this keyword [duplicate]

提问人:epixme 提问时间:1/13/2021 最后编辑:epixme 更新时间:7/16/2022 访问量:422

问:

在我提出问题之前,我将设置一些上下文。

我还在学习,今天做了一个练习,我不得不使用带有“this”关键字的传统函数。

使用下面的示例和控制台.log,我能够检索我想要的值,例如input.value。

let inputs = document.querySelectorAll(".controls input")
let input = document.querySelector("input")

const handleUpdate(){
 
 console.log(this.value) \\ the output is the value of input.value eg 25
  
}

  inputs.forEach(item=>item.addEventListener("mousemove", handleUpdate))
  inputs.forEach(item=>item.addEventListener("change", handleUpdate))

但是,如果我使用带有粗箭头的 ES6 函数,那么它不起作用并变得“未定义”。

在疯狂地阅读文章之后,我明白“这个”总是指向父对象,例如。全局对象(窗口)(如果我错了,请纠正我。因此,在这种情况下,ES6 函数将始终返回 'undefined'。如果我将“this.value”更改为“input.value”,它可以正常工作,请参见下文。

let inputs = document.querySelectorAll(".controls input")
let input = document.querySelector("input")

const handleUpdate=()=>{
 
 console.log(this.value) \\ undefined
console.log(input.value) \\ the output is the value of input.value eg 25
  
}

  inputs.forEach(item=>item.addEventListener("mousemove", handleUpdate))
  inputs.forEach(item=>item.addEventListener("change", handleUpdate))

我的问题是我应该使用第一种方法,它是带有“this”关键字的传统函数还是带有 ES6 语法的方法(这只是意味着我不能使用“this”关键字)。我使用哪个重要吗?

感谢您对此的任何帮助。

JavaScript 函数 ecmascript-6 这个

评论

5赞 Thomas Sablik 1/13/2021
您应该使用解决问题的方法。
0赞 epixme 1/13/2021
谢谢,他们都解决了问题:-)但我只是想知道使用一个而不是另一个的好处。谢谢
1赞 Liam 1/13/2021
箭头函数没有什么“更现代”的了。它们用于不同的东西
1赞 Liam 1/13/2021
Does it matter which I use,是的,因为正如你所发现的那样,它被区别对待this
0赞 Bergi 1/13/2021
使用 ES6 声明。function

答:

0赞 Yash Tibrewal 1/13/2021 #1

如果我错了,请纠正我。

就方法而言,当我们比较函数和胖箭头函数时,只要我们了解它们之间的区别,这是个人选择,正如 MDN 文档所说

箭头函数表达式是传统函数表达式的紧凑替代方法,但受到限制,不能在所有情况下使用。

箭头函数的 mdn doc

但是,在阅读了您的方法后,我建议您采用第一种方法。

一个原因是,如果任何新开发人员加入团队,并且不了解语法,他可能会像您一样在处理解决方案时遇到一些困难。但同样,应该尽可能尝试使用最新的代码技术。

评论

0赞 Quentin 1/13/2021
箭头函数不是“新语法”。它们已经存在多年,是 JS 标准的一部分,如果新开发人员不了解它们,那么他们需要学习它们。我们不能仅仅因为一个新开发人员可能没有学到任何关于本世纪新 JS 的知识而禁止自己编写现代代码。
0赞 Yash Tibrewal 1/13/2021
@QuentinI更新并删除了“新语法”,我也是新手,我只是试图回答他。另外,我同意你的观点,即我们不应该将自己局限于学习编写代码的新方法,我只是保留了我的观点。
0赞 Quentin 1/13/2021
重新编辑:如果加入团队的新开发人员不了解函数表达式语法怎么办?同样的观点也适用。选择任意的 JavaScript 片段作为“人们可能必须学习的东西”是愚蠢的。
0赞 Yash Tibrewal 1/13/2021
我明白了,如果这个答案非常错误,我应该删除吗?@Quentin
0赞 Tudor Constantin 1/13/2021 #2

使用传统的函数声明,因为它会将函数与 UI 分离,因此:handleUpdate()

  • 您可以在完全不同的文件中实现它,并在需要其功能的任何位置重复使用它
  • 该函数不需要在使用它的上下文中定义变量input

如果你仍然怀疑这是要走的路,VueJS 还在几个地方使用了传统函数,如果使用胖箭头函数,这些东西实际上不起作用:

来自 Vue 的官方文档

不要在选项属性或回调中使用箭头函数,例如 [...]。由于箭头函数绑定到父上下文,因此不会像你所期望的那样是 Vue 实例,这通常会导致错误,例如 .created: () => console.log(this.a)thisUncaught TypeError: Cannot read property of undefined

所以,是的,不要担心使用传统功能,特别是如果你能解释你选择背后的原因。

评论

1赞 epixme 1/13/2021
我绝对看到了可重用性的好处。感谢您抽出宝贵时间回答,这帮助我更清楚地了解事情。