3

タグの数を警告する関数は次childNodesのとおりです。body

    function countBodyChildren() {
      var body_element = document.getElementsByTagName("body")[0];
      alert(body_element.childNodes.length);
}

 window.onload = countBodyChildren;

()関数は正常に実行されますが、関数名の末尾に追加するとwindow.onload = countBodyChildren();、関数は実行されません。どうしてこれなの?関数を呼び出すことを考えました。パラメーターが必要ない場合でも、常に()その名前の最後に追加します。

4

3 に答える 3

9

関数を呼び出すことを考えました。パラメーターが不要な場合でも、名前の最後に常に()を追加します。

あなたは正しく考えました。ただし、ここでは、関数を呼び出したくありません。時が来たらどの関数を呼び出すかをブラウザに伝えたいと思います。

括弧を追加すると、すぐに(ロード時ではなく)関数が呼び出されます。関数が実行されます。要素を検索しようとしますbodyが、まだロードされていません。したがって、body_element最終的にはundefined。を見上げるchildNodesundefined、エラーが発生します。window.onload割り当ては発生しません。

関数がエラーをスローしなかったとしても、それはを返したはずなundefinedので、にwindow.onloadなるundefinedので、ページが最終的にロードされても何も起こりません。

代わりに、関数は単なる別の種類の価値であると考え始める必要があります。あなたが言う時

function a() {
  // ...
}

これと同じです:

a = function() {
  // ...
};

(実際には違いがあり、重要なものがありますが、今のところ関係ありません。基本を理解したら、それらを調べてください)。関数が変数に「含まれる」ようになりましたa。次に、これを行うことができます:

var b = a;
b();

そしてそれは機能します-あなたはa(あなたの関数)にあったものを変数bに入れて、それからその新しい名前を呼び出すことによってそれを実行します(今は両方とも同じ関数aを参照しているので)。b同じように、

window.onload = countBodyChildren;

これで、オブジェクトのonloadプロパティにwindow関数が含まれます。読み込みが完了すると、ブラウザはそこにあるものをすべて実行します。

あなたは時期尚早の死刑執行のケースがありました。

于 2012-06-22T15:19:03.223 に答える
1

window.onload期待されるのは、関数または関数定義への参照です。

かっこを付けると、実際に関数が実行され、に割り当てられるのは関数の戻り値ですwindow.onload

于 2012-06-22T15:19:49.243 に答える
1

window.onload = countBodyChildren();

つまり、「関数を呼び出し、関数の戻り値をウィンドウ オブジェクトの onload プロパティに割り当てます。関数は何も返しません。

例えば

function countBodyChildren() {
      var body_element = document.getElementsByTagName("body")[0];
      alert(body_element.childNodes.length);
return 5;
}
window.onload = countBodyChildren();

これは、onload prop に 5 を割り当てます。あなたが望むものではありません。イベントが発生したときに js エンジンが関数を呼び出せるように、関数参照を onload prop に割り当てる必要があります。

于 2012-06-22T15:21:18.663 に答える