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

Lit*_*les 15 javascript addeventlistener

所以我们有一个页面:

<span id='container'>
    <a href='#' id='first'>First Link</a>
    <a href='#' id='second'>Second Link</a>
</span>
Run Code Online (Sandbox Code Playgroud)

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

first.addEventListener('click', function(){alert('sup!');})
Run Code Online (Sandbox Code Playgroud)

奇迹般有效!但是,当您将第二个参数设为外部函数时:

function message_me(m_text){
    alert(m_text)
}

second.addEventListener('click', message_me('shazam'))
Run Code Online (Sandbox Code Playgroud)

它立即调用该函数.我怎么能阻止这个?很烦人!

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

cla*_*lav 18

function message_me(m_text){
    alert(m_text)
} 

second.addEventListener('click', 
    function() {
        message_me('shazam');
    }
);
Run Code Online (Sandbox Code Playgroud)

这是一个更新的小提琴.

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

Ian*_*Ian 15

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

你可以这样做:

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

second.addEventListener('click', function () {
    message_me('shazam')
});
Run Code Online (Sandbox Code Playgroud)

或这个:

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

second.addEventListener('click', message_me('shazam'));
Run Code Online (Sandbox Code Playgroud)

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


Jes*_*nee 11

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

second.addEventListener('click', () => message_me('shazam'))
Run Code Online (Sandbox Code Playgroud)


小智 10

或者你可以使用.bind

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

second.addEventListener('click', message_me.bind(this, 'shazam'));
Run Code Online (Sandbox Code Playgroud)

查看 关于'闭包'的MDN文档

  • +1 绑定应该是可行的方法 - 不确定 4 年前是否可用,但绝对是今天的首选方法,而不是创建匿名函数 (2认同)
  • @VLAZ,你让我摆脱了退休生活;)这里有一些事情。(1) 在发表此评论时,箭头函数 `()=&gt;{...}` 和 ES6 仍然相对较新,并且由于 IE 不支持它而受到阻碍。(2) 匿名函数实际上是更长的 `function(){...}` 语法,可读性较差。(3) 虽然构造底层函数可能会更慢,但对“bind()”函数的调用要快得多 (1.5-2 倍),这在循环中可能很重要。我同意你关于“this”被强制设置的观点:) JS 的美妙之处在于选项。 (2认同)