だから私たちはページを持っています:
<span id='container'>
<a href='#' id='first'>First Link</a>
<a href='#' id='second'>Second Link</a>
</span>
そして、いくつかのクリックイベントを追加したい:
first.addEventListener('click', function(){alert('sup!');})
魅力的な作品!ただし、2番目の引数を外部関数にすると、次のようになります。
function message_me(m_text){
alert(m_text)
}
second.addEventListener('click', message_me('shazam'))
関数をすぐに呼び出します。どうすればこれを止められますか?とても迷惑!
これがライブデモです: http://jsfiddle.net/ey7pB/1/
Ianの引用 answer :
2番目のパラメーターは関数referenceを想定しているため、1つ指定する必要があります。問題のあるコードでは、すぐに関数を呼び出し、そのresultを渡します(これは
undefined
...なので、すべての関数はalert
および何も返しません)。 (最初の例のように)匿名関数で関数を呼び出すか、関数を変更して関数を返します。
function message_me(m_text){
alert(m_text)
}
second.addEventListener('click',
function() {
message_me('shazam');
}
);
これが更新された fiddle です。
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'));
または.bindを使用できます
function message_me(m_text){
alert(m_text);
}
second.addEventListener('click', message_me.bind(this, 'shazam'));
check MDN Documentation 「クロージャ」について
矢印関数を使用した最新のES6ソリューション
second.addEventListener('click', () => message_me('shazam'))