13

私はイベントハンドラーを初めて使用し、以下に記述されているコードに出くわしました

document.addEventListener("DOMContentLoaded", function() {
    initialiseMediaPlayer();
}, false);

と同じコードを書くことに違いはありますか

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer();, false);

最終的には同じ関数を呼び出しているので、違いはありますか、それとも上記の方法で書くことに利点はありますか?

4

4 に答える 4

46
document.addEventListener("DOMContentLoaded", function() {
    initialiseMediaPlayer();
}, false);

initialiseMediaPlayerdom コンテンツがロードされたときに実行されます。

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer();, false);

構文エラーです。セミコロンを削除した場合:

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer(), false);

すぐに呼び出しinitialiseMediaPlayerてから、戻り値 (おそらく関数ではないaddEventListener) を に渡します。これは思い通りにはなりません。


できるよ

    document.addEventListener("DOMContentLoaded", initialiseMediaPlayer, false);

(括弧 = 関数呼び出しを削除します)。次にinitialiseMediaPlayer、ロードされた dom コンテンツで実行され、必要に応じて動作します。

ただし、前者の場合とは異なり、initialiseMediaPlayer実際にはブラウザから与えられた引数を受け取ります。また、その戻り値はブラウザによって受信されます。の場合DOMContentLoaded、ほとんどの場合、これはあまり重要ではありません。

また、直接渡す場合は、余分な無名関数を 1 つ作成することも避けinitialiseMediaPlayerられます。繰り返しますが、この効果はユーザーの観点からは実際には認識できません。

于 2013-03-06T19:16:12.150 に答える
10

1)。はい、大きな違いがあります。2 番目のバージョンではエラーがスローされます。ただし、次のように修正しても:

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer(), false);

initialiseMediaPlayer結果ではなく関数への参照を渡す必要がありますが、すぐに実行されるDOMContentLoadedため、呼び出されません。()

2)。もう 1 つの大きな違いは、呼び出しのコンテキストです

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer, false);

initialiseMediaPlayerオブジェクトのコンテキストで呼び出されdocumentます。最初のバージョンはWindowオブジェクト コンテキストで呼び出されます。

于 2013-03-06T19:12:47.280 に答える
8

関数の 2 番目の引数は、addEventListener()function を受け入れます。これは関数呼び出しであるため、渡すことはできません。initialiseMediaPlayer();

あなたができることは次のとおりです。

var onDOMContentLoaded = function() {
    initialiseMediaPlayer();
};
document.addEventListener("DOMContentLoaded", onDOMContentLoaded, false);
于 2013-03-06T19:08:48.753 に答える
0

最初の場合

document.addEventListener("DOMContentLoaded", function() {
    initialiseMediaPlayer();
}, false);

function(){initialiseMediaPlayer();}ドキュメントのイベント「DOMContentLoaded」がトリガーされると、匿名関数がトリガーされるように登録されます

2 番目のケースでは:

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer();, false);

イベントリスナーとして登録されるのは、式の結果ですinitialiseMediaPlayer()

そう、はい、違いがあります:)

于 2013-03-06T19:13:02.510 に答える