提问人:epixme 提问时间:1/13/2021 最后编辑:epixme 更新时间:7/16/2022 访问量:422
胖箭头或带有此关键字 [duplicate] 的 function()
Fat arrow or function() with this keyword [duplicate]
问:
在我提出问题之前,我将设置一些上下文。
我还在学习,今天做了一个练习,我不得不使用带有“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”关键字)。我使用哪个重要吗?
感谢您对此的任何帮助。
答:
如果我错了,请纠正我。
就方法而言,当我们比较函数和胖箭头函数时,只要我们了解它们之间的区别,这是个人选择,正如 MDN 文档所说
箭头函数表达式是传统函数表达式的紧凑替代方法,但受到限制,不能在所有情况下使用。
但是,在阅读了您的方法后,我建议您采用第一种方法。
一个原因是,如果任何新开发人员加入团队,并且不了解语法,他可能会像您一样在处理解决方案时遇到一些困难。但同样,应该尽可能尝试使用最新的代码技术。
评论
使用传统的函数声明,因为它会将函数与 UI 分离,因此:handleUpdate()
- 您可以在完全不同的文件中实现它,并在需要其功能的任何位置重复使用它
- 该函数不需要在使用它的上下文中定义变量
input
如果你仍然怀疑这是要走的路,VueJS 还在几个地方使用了传统函数,如果使用胖箭头函数,这些东西实际上不起作用:
来自 Vue 的官方文档:
不要在选项属性或回调中使用箭头函数,例如 [...]。由于箭头函数绑定到父上下文,因此不会像你所期望的那样是 Vue 实例,这通常会导致错误,例如 .
created: () => console.log(this.a)
this
Uncaught TypeError: Cannot read property of undefined
所以,是的,不要担心使用传统功能,特别是如果你能解释你选择背后的原因。
评论
Does it matter which I use
,是的,因为正如你所发现的那样,它被区别对待this
function