在javascript中为事件处理程序使用胖箭头语法不会';行不通

在javascript中为事件处理程序使用胖箭头语法不会';行不通,javascript,event-handling,anonymous-function,Javascript,Event Handling,Anonymous Function,我有一些输入元素,我想在change事件上附加事件侦听器,如下所示: inputs.forEach(input => input.addEventListener('change', handleUpdate)); 现在,当定义为如下命名函数时,handleUpdate处理程序函数可以工作: function handleUpdate() { console.log(this.value); } const handleUpdate = () => console.log(t

我有一些输入元素,我想在
change
事件上附加事件侦听器,如下所示:

inputs.forEach(input => input.addEventListener('change', handleUpdate));
现在,当定义为如下命名函数时,
handleUpdate
处理程序函数可以工作:

function handleUpdate() {
  console.log(this.value);
}
const handleUpdate = () => console.log(this.value)
但是,当与下面这样的胖箭头语法一起使用时,这不起作用:

function handleUpdate() {
  console.log(this.value);
}
const handleUpdate = () => console.log(this.value)
现在我知道,
设置为窗口对象,解决此问题的一种方法是:

const handleUpdate = (ev) => console.log(ev.target.value);

但是这是在Javascript中为事件处理程序使用fat arrow语法的正确方法,还是不建议首先使用它们?

es6 fat arrow表示法将“this”的值保留在创建函数的上下文中。如果要在函数中更改“this”的值,应在函数上使用“bind”。 及

不是匿名函数。这是一个名为“handleUpdate”的函数。匿名函数是一个没有指定名称的函数,因此不能在定义的上下文中使用它来调用execpt。范例

target.addEventListener('click', () => { doSomeStuff() };
因此,您的问题不会在您发布的代码的上下文中计算

编辑绑定用法:

var handleUpdate = function() {console.log(this.value)};
handleUpdate = handleUpdate.bind(whatever_you_want_this_to_mean_inside_the_function);


方法call()、apply()和bind()不会在arrow函数中更改此值。(事实上,函数内部的这个值是无法更改的–它将与调用函数时的值相同。)如果需要绑定到不同的值,则需要使用函数表达式。

es6 fat arrow符号将“this”的值保留到创建函数的上下文中。如果要在函数中更改“this”的值,应在函数上使用“bind”。 及

不是匿名函数。这是一个名为“handleUpdate”的函数。匿名函数是一个没有指定名称的函数,因此不能在定义的上下文中使用它来调用execpt。范例

target.addEventListener('click', () => { doSomeStuff() };
因此,您的问题不会在您发布的代码的上下文中计算

编辑绑定用法:

var handleUpdate = function() {console.log(this.value)};
handleUpdate = handleUpdate.bind(whatever_you_want_this_to_mean_inside_the_function);


方法call()、apply()和bind()不会在arrow函数中更改此值。(事实上,函数内部的这个值是无法更改的–它将与调用函数时的值相同。)如果需要绑定到不同的值,则需要使用函数表达式。

()=>console.log(this.value)
并非真正的匿名函数-其名称将设置为
handleUpdate
(与您分配给它的名称相同)。是的,正是这个函数成为了一个问题,因为它有一个词汇绑定
this
。你应该记住你真正定义函数的地方。在JS中,默认情况下,所有函数定义都被提升到块的顶部。但是,如果在尝试将函数
handleUpdate
用作事件处理程序后,通过函数文本定义该函数,它将不会被提升,因此对于
输入,
expression(…)
表达式,
handleUpdate
的值将未定义。
()=>console.log(this.value)
并非真正的匿名函数-其名称将设置为
handleUpdate
(与您分配给它的名称相同)。是的,正是这个函数成为了一个问题,因为它有一个词汇绑定
this
。你应该记住你真正定义函数的地方。在JS中,默认情况下,所有函数定义都被提升到块的顶部。但是,如果在尝试将函数
handleUpdate
用作事件处理程序后,通过函数文本定义该函数,它将不会被提升,因此对于
inputs.forEach(…)
表达式
handleUpdate
的值将未定义。如何在此上下文中使用绑定?@AmitErandole请参阅更新的答案。如何在此上下文中使用绑定?@AmitErandole请参阅更新的答案。