windowはブラウザのJavaScriptではグローバルオブジェクトと呼ばれるもので、いちばん外側のスコープになります。
そして、JavaScriptには、変数の定義を、現在のスコープから探し、なければ外のスコープに探しに行くしくみがあります(スコープチェーン)。
内側のスコープにsetTimeoutが定義されていなければ、外へ外へと辿って行って、最終的にwindow.setTimeoutにたどり着きます。
外へ外へと探しに行く途中のスコープにsetTimeoutが定義されていると、それが呼ばれます。
ほかのオブジェクトで絶対setTimeoutなんて定義していない状況であれば、省略しても問題ありません。
複雑なプログラムで途中のスコープでsetTimeoutが定義されている可能性がある場合や、明示的にグローバル関数のalertを呼びたいことを示したい場合は、window.setTimeoutと書くとよいでしょう。
Program
簡単のためにwindow.alertで書きます。
windowを省略しないで書く。
window.alert('Hello'); // → Hello
windowを省略して書く。
alert('Hello'); // → Hello
windowを省略したとき、内側のスコープに同じ名前の関数が定義されていた場合と、その状況でもwindowを省略しないで書いた場合。
// 外のスコープ (function(){ // 1つ内側のスコープ function alert() { window.alert('内側のスコープのalertが呼ばれました'); } alert('Hello'); // 内側のスコープにあるalertが呼ばれる → '内側のスコープのalertが呼ばれました' window.alert('Hello'); // windowのalertが呼ばれる → Hello })();