1つ目のソースコード
<script>
var myfunc = function(){
document.getElementById("p").innerHTML = "test";
};
window.onload = myfunc();
</script>
<p id="p"></p>
の window.onload = myfunc();
では、 myfunc
関数を呼び出してその返り値(ここでは undefined
)を window.onload
に代入しています。ブラウザが HTML を上から読んでいってこの行に到達したときに myfunc
関数を呼び出し、その中の document.getElementById("p")
が実行されることになりますから、この行より後に書かれている p 要素は当然見つかりません。2つ目のソースコードが動くのはこの行が p 要素の下に移動したからです。
window.onload = myfunc;
と修正すれば、意図通り onload のタイミングで myfunc
関数が呼び出されるようになります。
なお、3つ目のソースコードの function(){myfunc()}
は即時関数になっていません。即時関数とは (function() { ... })()
の形で、匿名関数をその場で呼び出す書き方のことですが、ここでは呼び出していないためにただの匿名関数になっています。「myfunc()
を呼び出す匿名関数」が onload のタイミングで呼び出された結果、意図した動作になっています。