因此,我们有一个页面:

<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/

评论

由于第二个参数需要函数引用,因此您需要提供一个。使用有问题的代码,您将立即调用该函数并传递其结果(未定义)。在匿名函数中调用该函数(如您的第一个示例),或者更改该函数以返回一个函数(可能不理想)。

为什么这不理想?似乎反对D.R.Y.在4个左右的im设置的addEventListeners中复制我的函数,不是吗?

另一种选择是将所需消息作为属性存储在元素上,然后将函数绑定为second.addEventListener('click',message_me),并使其从属性而不是从参数检索消息。

如何在addEventListener中使用参数传递函数的可能重复项?

#1 楼

引用伊恩的答案:


由于第二个参数需要函数引用,因此您需要提供一个。使用有问题的代码,您立即调用该函数并传递其结果(为undefined,因为该函数所做的全部为alert且不返回任何内容)。可以在匿名函数中调用该函数(如您的第一个示例),也可以更改该函数以返回一个函数。

评论


我认为您应该更新您接受的答案,因为在不调用函数的情况下传递函数并进行绑定-在这里可能是更好的选择。

– IonicBurger
16-11-2在14:53

您能解释一下为什么您认为绑定是更好的选择吗?

–clav
16年11月2日在16:07

#2 楼

由于第二个参数需要函数引用,因此您需要提供一个。使用有问题的代码,您立即调用该函数并传递其结果(为undefined,因为该函数所做的全部为alert且不返回任何内容)。可以在匿名函数中调用该函数(如第一个示例),也可以更改该函数以返回函数。

您可以执行以下操作:

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

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

< br或此:

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文档
有关“关闭”的信息

评论


+1绑定应该是可行的方式-不确定4年前是否可用,但肯定是今天的首选方式,而不是创建匿名函数

–vol7ron
17 Mar 7 '17 at 0:40



绑定的好建议,绝对应该是公认的答案。 OP可以更改吗?

– blueprintchris
18年5月31日晚上10:50

#4 楼

使用箭头功能的现代ES6解决方案

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