【问题标题】:addEventListener calls the function without me even asking it toaddEventListener 调用该函数,我什至没有要求它
【发布时间】:2021-12-21 17:22:45
【问题描述】:

所以我们有一个页面:

<span id='container'>
    <a href='#' id='first'>First Link</a>
    <a href='#' id='second'>Second Link</a>
</span>

并且想添加一些点击事件:

first.addEventListener('click', function(){alert('sup!');})

像魅力一样工作!但是,当您将第二个参数设为外部函数时:

function message_me(m_text){
    alert(m_text)
}

second.addEventListener('click', message_me('shazam'))

它立即调用该函数。我怎样才能阻止这个?好烦!

这是一个现场演示:http://jsfiddle.net/ey7pB/1/

【问题讨论】:

  • 因为第二个参数需要一个函数reference,所以你需要提供一个。使用有问题的代码,您会立即调用该函数并传递其结果(即 undefined)。在匿名函数中调用该函数(如您的第一个示例)或将函数更改为 return 一个函数(可能不理想)。
  • 为什么这不理想?似乎反对 D.R.Y.在我设置的 4 个左右 addEventListeners 中复制我的函数,不是吗?
  • 另一种选择是将所需消息作为属性存储在元素上,然后将函数绑定为second.addEventListener('click', message_me) 并让它从属性而不是参数中检索消息。

标签: javascript addeventlistener


【解决方案1】:

引用伊恩的answer

由于第二个参数需要一个函数reference,因此您需要提供一个。使用有问题的代码,您将立即调用该函数并传递其 result(即undefined...因为该函数所做的所有事情都是alert 并且不返回任何内容)。在匿名函数中调用函数(如您的第一个示例)或更改函数以返回函数。

function message_me(m_text){
    alert(m_text)
} 

second.addEventListener('click', 
    function() {
        message_me('shazam');
    }
);

这是更新后的fiddle

【讨论】:

  • 我认为你应该更新你接受的答案,因为传递函数而不调用它,并且 bind - 在这里可能是一个更好的选择。
  • 您能解释一下为什么您认为 bind 是更好的选择吗?
【解决方案2】:

由于第二个参数需要一个函数reference,因此您需要提供一个。使用有问题的代码,您将立即调用该函数并传递其 result(即undefined...因为该函数所做的所有事情都是alert 并且不返回任何内容)。在匿名函数中调用函数(如您的第一个示例)或更改函数以返回函数。

你可以这样做:

function message_me(m_text){
    alert(m_text);
}

second.addEventListener('click', function () {
    message_me('shazam')
});

或者这个:

function message_me(m_text){
    return function () {
        alert(m_text);
    };
}

second.addEventListener('click', message_me('shazam'));

演示: http://jsfiddle.net/tcCvw/

【讨论】:

    【解决方案3】:

    或者你可以使用 .bind

    function message_me(m_text){
        alert(m_text);
    }
    
    second.addEventListener('click', message_me.bind(this, 'shazam'));
    

    检查MDN Documentation 关于“关闭”

    【讨论】:

    • +1 绑定应该是可行的方式——不确定 4 年前是否可用,但绝对是今天的首选方式,而不是创建匿名函数
    • 对绑定的好建议,绝对应该是公认的答案。 OP可以改变吗?
    【解决方案4】:

    使用箭头函数的现代 ES6 解决方案

    second.addEventListener('click', () => message_me('shazam'))
    

    【讨论】:

      猜你喜欢
      • 2023-02-05
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      相关资源
      最近更新 更多