addEventListener在没有我甚至要求的情况下调用该函数

时间:2013-04-30 23:12:19

标签: javascript addeventlistener

所以我们有一个页面:

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

4 个答案:

答案 0 :(得分:15)

function message_me(m_text){
    alert(m_text)
} 

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

这是一个更新的fiddle

答案 1 :(得分:12)

由于第二个参数需要函数引用,因此您需要提供一个。对于有问题的代码,您立即调用该函数并传递其结果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'));

DEMO: http://jsfiddle.net/tcCvw/

答案 2 :(得分:8)

或者您可以使用.bind

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

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

检查MDN Documentation  关于&#39;关闭&#39;

答案 3 :(得分:1)

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

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