0

関数ポインターをイベント ハンドラーに渡すときに、関数ブロックを括弧で呼び出すことはできず、その関数の戻り値がイベント ハンドラーに割り当てられることを理解しています。私はこれを試しましたが、それがどのように機能するのか混乱していますか?

window.onload = alert("Hello, World.");

私はこれがどのように機能するかを見ることができます...

window.onload = function () { alert("Hello, World!"); };

リテラル関数は自己呼び出しではなく、戻り値がなく、onclick イベントが呼び出されたときにのみ呼び出されます。

編集1:これで何も達成したくありません。window.onload = alert("Hello, World."); の仕組みを理解したいだけです。完全に動作し、window.onload = show_message("Hello, World."); 動作しませんか?... show_message が実際には関数であることを考慮してください。

編集 2:一部のユーザーは、onload イベント ハンドラーが任意の関数の括弧で動作すると主張しています。関数がイベント ハンドラーを無視して呼び出され、その関数の戻り値がイベント ハンドラーに割り当てられるため、これが正常に機能するとは思いません。ほとんどの関数は何も返さないため、(undefined または null) がイベント ハンドラーに割り当てられます。

以下のコードを見てください。

var button = document.getElementById("button");

function test() {
    str = "works";
    console.log(str);
}

button.onclick = test;​

ボタンの id が割り当てられたボタン要素があるとします。これは、test が括弧で呼び出されていない場合にのみ機能します (button.onclick = test();)。テストは 1 回だけ実行され、未定義が onclick に割り当てられます。

編集 3:関数が呼び出された場合、戻り値がイベント ハンドラーに割り当てられていないようです。console.log を使用すると、常にコンソールに null が出力されます。

4

2 に答える 2

2

良い質問です。実際には、期待どおりに機能しません。そのように機能するというのは単なる幻想です。実行すると:

window.onload = alert("Hello, World.");

ステートメントの右側の部分が実行され、アラートが表示されますが、ロード ハンドラーのウィンドウは何らかの関数に設定されておらず、nullアラートが返すものであるため、それに割り当てられます。

ちなみに、括弧でメソッドを呼び出しても、そこから関数を返してイベント ハンドラーに割り当てることができます。

var button = document.getElementById("button");

function test() {
    str = "works";
    console.log(str);
    return function(){console.log('button clicked');}
}

button.onclick = test();
于 2012-08-11T07:47:49.220 に答える
2

window.onload = alert("Hello, World.");、実行時にアラートが発生するという理由だけでアラートが機能することを確認し、結果 (未定義) を に割り当てwindow.onloadます。

于 2012-08-11T07:48:06.343 に答える