【JavaScript】windowとは?初心者向けに仕組みや使い方をわかりやすく解説

はじめに

JavaScriptでウェブページの操作をするときに、必ず登場する要素が windowオブジェクト です。
見慣れない初心者の方も多いかもしれませんが、ブラウザを動かす上で重要な役割を持っています。
たとえば画面にポップアップを出したり、スクロール位置を取得したりといった操作も、このwindowオブジェクト経由で行えます。
ただ、最初に学ぶときには大きな概念に感じるかもしれません。
そこで、本記事ではなるべくやさしい言葉を使いながら、幅広い場面で必要となるwindowオブジェクトを詳しく解説していきます。

この記事を読むとわかること

  • windowオブジェクトの基本的な役割
  • よく使われるプロパティやメソッドの具体例
  • 実務で役立つ活用シーン
  • 初心者がつまずきやすいポイントと対処方法

windowオブジェクトとは何か

JavaScriptでウェブブラウザを扱う際、最も根元に位置づけられるのがwindowオブジェクトです。
ブラウザを通じて、ユーザーが見ている画面を「ウィンドウ」と呼ぶイメージがあるかもしれません。
実際に、プログラム側ではこのウィンドウ全体を windowオブジェクト として表現します。

ふだん、JavaScriptのコードを書くときには意識しないで使っていることが多いでしょう。
たとえば console.log ("Hello World") ; のように書くときも、実は大元にあるのはwindowオブジェクトです。 なぜならば、JavaScriptで使える基本的なオブジェクトや関数は、windowの持ち物になっているものが多いからです。

windowオブジェクトを直接変数のように宣言することはありません。
しかし、上記のように裏側で多くの機能を提供しているのがwindowであり、プログラミングをするときの土台のような存在だと考えるとわかりやすいでしょう。

windowオブジェクトの代表的なプロパティ

windowには数多くのプロパティがありますが、よく使うものをいくつか取り上げます。
これらは実務でも日常的に利用されることが多いです。

document

documentは、ブラウザで表示されているHTMLドキュメントそのものを表すオブジェクトです。
DOM(ドキュメントオブジェクトモデル)の操作を行うときに必要不可欠で、ページに存在する要素をJavaScriptから操作するための窓口になります。
たとえば、document.getElementById("sample")のように書くことで、特定の要素を取得できる仕組みになっています。

innerWidth / innerHeight

ウィンドウの表示領域の幅と高さをそれぞれ取得するプロパティです。
画面レイアウトを動的に変更したいときなどに便利です。
以下のように使います。

console.log(window.innerWidth);  // ブラウザのコンテンツ表示領域の幅を取得
console.log(window.innerHeight); // ブラウザのコンテンツ表示領域の高さを取得

初学者の方には、レスポンシブ対応で要素配置を工夫するときに役立つでしょう。
画面サイズを変化させながら、これらの値を確認すると、リアルタイムで幅や高さが変わるのがわかります。

location

現在表示しているページのURL情報を扱うオブジェクトです。
location.hrefでURLの参照や変更をしたり、location.reload()メソッドでページを再読み込みしたりできます。
SPA(Single Page Application)のように画面遷移を内部で制御する場合でも、locationオブジェクトを活用する場合があります。

navigator

ブラウザの情報やOSに関する情報を持つオブジェクトです。
ユーザーがどのブラウザを使っているか、どんなプラットフォームを使っているかなどのデータを取得できます。
ただし、プライバシー保護の観点から、得られる情報に制限があったり、細かなバージョン情報が省略されるケースもあります。

history

ブラウザの履歴を管理するオブジェクトです。
history.back()やhistory.forward()などを使えば、一つ前のページに戻ったり、一つ先のページに進んだりすることが可能です。
ただし、機密性の高い操作であるため、自由に操作しすぎるとユーザーを混乱させるおそれがあります。

windowオブジェクトの代表的なメソッド

windowオブジェクトは、多数のメソッドを備えています。
ここでは、初心者でも使いやすいものを中心に解説します。

alert

簡単なメッセージダイアログを表示するメソッドです。
ユーザーへ注意を促すときや情報を伝えるときに利用されます。

alert("入力内容に誤りがあります。");

このように書くと、OKボタンだけが表示されたポップアップが画面中央に現れます。
ユーザーがボタンを押すまで処理が一時的に停止する点が特徴です。

confirm

ユーザーからのYes/No(OK/キャンセル)といった2択の回答を得るためのダイアログを表示します。

const result = confirm("削除してもよろしいですか?");
if (result) {
  // OKが押された場合の処理
} else {
  // キャンセルが押された場合の処理
}

alertと同様に、ダイアログが出ている間はスクリプトの処理が止まるので注意が必要です。
しかし、ユーザーの最終確認を求めるケースではシンプルに使えて便利です。

prompt

ユーザーに文字入力を求めるダイアログを表示します。
たとえば、ユーザー名の入力など、小さいフォームを手軽に実装したいときに便利です。

const userInput = prompt("名前を入力してください。");
console.log("入力された名前:", userInput);

ただし、最近ではモーダルウィンドウを自作したり、HTMLフォームの入力欄を使ったりする方がUI的に好まれます。
そのためpromptの利用頻度は下がりつつありますが、学習用として基本を押さえておくのは大切です。

setTimeout / setInterval

タイマー処理を行う際に使うメソッドです。
setTimeout は指定時間後に一度だけ処理を実行し、setInterval は指定時間ごとに処理を繰り返します。

setTimeout(() => {
  console.log("3秒後に実行される処理");
}, 3000);

const timerId = setInterval(() => {
  console.log("2秒ごとに繰り返し実行される処理");
}, 2000);

// 繰り返しを止めるにはclearInterval(timerId)を呼ぶ

たとえばローディング画面を一定時間後に閉じる、数秒ごとにお知らせを表示するといった用途で便利です。
繰り返し処理を止めたいときはclearIntervalなどを使いこなしましょう。

実務での活用イメージ

windowオブジェクトが関わる場面は幅広いです。
単にポップアップの表示だけではなく、以下のような実務的なシチュエーションで役立ちます。

1つ目は、ページのレイアウトを動的に切り替えるときです。
たとえば、ユーザーが画面をリサイズしたときに自動で配列し直す処理を組み込む場合、windowのイベントリスナーを使って resize イベントをキャッチします。

window.addEventListener("resize", () => {
  // 画面サイズに応じて要素の配置を変える処理
});

このようにして画面が変化するたびに実行される仕組みを作れば、柔軟なレイアウトを提供できます。
また、タブ切り替えやスクロールイベントなども、windowに紐づくイベントとして扱えます。

2つ目は、URLのパラメータを取得して画面表示を変える場合です。
前述したlocationオブジェクトのsearch(クエリ文字列)を解析して、ユーザーが開いたURLに合わせたコンテンツを読み込むといった使い方もあります。

これらの活用シーンを知っておくと、自分のアイデアをページ上で実現しやすくなるはずです。

documentオブジェクトとの関係

冒頭で少し触れましたが、windowオブジェクトとdocumentオブジェクトは切っても切り離せない関係にあります。
多くの人が「DOM操作」という言葉を耳にするように、実際のページ内容を操作するのはdocumentオブジェクトを通じて行います。

しかし、documentはwindowの一部でもあるため、実際には window.document と書いても問題ありません。
多くの場合、windowは省略されるため、直接document.getElementById(...)のように記述するのが一般的です。

実務上は「画面上の要素を操作するときはdocument」「それ以外のブラウザ全体の操作はwindow」というイメージを持っておくとわかりやすいでしょう。

イベントリスナーの登録方法

windowオブジェクトには多彩なイベントが用意されています。
代表的なものに、ページ読み込み完了時に発火する load イベントや、ページを閉じる前に呼ばれる beforeunload イベント、先ほど述べた resize イベントなどがあります。

イベントリスナーを登録するには、addEventListener メソッドを利用します。
たとえばページ読み込み完了後に特定の処理を行いたい場合、下記のように書くことができます。

window.addEventListener("load", () => {
  console.log("ページの読み込みが完了しました。");
});

これを使うと、HTML全体が読み込まれたタイミングで処理を走らせることができます。
逆にunload系のイベントを活用すれば、ユーザーがページを離れる直前のアクションを取得可能です。
ただし、ブラウザの仕様によっては、unloadの中で自由に処理を行うことが制限される場合があるので注意してください。

Cookieやストレージとの関わり

CookieやlocalStorage、sessionStorageといったブラウザの保存領域も、windowオブジェクトのもとで機能しています。
とくに localStorage は、同一ドメイン内で簡単なテキスト情報を永続的に保存するのに重宝します。
保存や読み込みもシンプルで、以下のような書き方になります。

// 値の保存
localStorage.setItem("username", "test_user");

// 値の取得
const storedUser = localStorage.getItem("username");
console.log(storedUser); // test_user

Cookieは document.cookie プロパティで扱うことが一般的ですが、window.document.cookieという書き方もできます。
実務では認証情報やトラッキング情報の保持など、Cookieを活用する場面がまだ多く存在します。
ただし、セキュリティやプライバシーに関わる重要なトピックなので、利用するときは細心の注意を払いましょう。

スクロール位置や画面座標の取得

ブラウザのスクロール位置を取得するシーンも、実際の開発ではよくあります。
たとえば、ページの上部までスクロールしてきたらヘッダーを固定表示するとか、ページの下部近くになったらボタンをフェードインさせるなど、ユーザーの操作に合わせた演出を実装するにはスクロール位置を把握する必要があります。

JavaScriptでは、 window.scrollXwindow.scrollY で水平方向と垂直方向のスクロール量を取得できます。
たとえば、下記のように書きます。

window.addEventListener("scroll", () => {
  const x = window.scrollX;
  const y = window.scrollY;
  console.log(`スクロール量: x=${x}, y=${y}`);
});

このようにイベントリスナー内で常にチェックすれば、ユーザーがスクロールするたびに値を読み取ることができます。
また、window.scrollTo メソッドを使うことで、特定の位置までページを強制的にスクロールさせることもできます。

ウィンドウ制御に関するメソッド

新しいタブやウィンドウを開くための window.open や、ウィンドウを閉じるための window.close などもあります。
ただし、これらをむやみに使うとユーザーが意図しないタイミングでポップアップが大量に開いてしまったり、セキュリティ面でブロックされたりといった問題が出る可能性があります。

さらに、ウィンドウの位置やサイズを動的に変更する moveTo, resizeTo といったメソッドも存在しますが、最近のブラウザでは制限が厳しく、利用できない場面もあります。
あまり積極的に使う機会は少なくなっているかもしれません。

ページの読み込みや遷移を監視する

前述の location オブジェクトを使えば、ユーザーがアクセスしているURLを参照したり、別のURLに飛ばすことができます。
また、 history.pushStatehistory.replaceState などを使うと、ブラウザのアドレスバーを書き換えつつシームレスにページを切り替えることも可能です。
これは、いわゆるSPAでルーティングを行う仕組みに近いものです。

一方で、使い方を間違えるとユーザーが戻るボタンを押しても思ったように画面が戻らない、といった混乱を招く可能性があります。
そのため、実務では専用のフレームワークを使い、裏側でwindowの機能を上手にラップしながら実装するケースが多いです。

window.onerrorを使ったエラー監視

JavaScriptの実行中にエラーが起こったとき、その内容をとらえるための仕組みとして window.onerror が知られています。
このイベントハンドラを活用すると、発生したエラーのメッセージや行番号などを取得して、サーバーにログ送信したり、ユーザーにエラー画面を表示したりできます。

window.onerror = function (message, source, lineno, colno, error) {
  console.log("エラーが発生:", message);
  // サーバーへエラー情報を送るなどの処理
};

ただし、セキュリティ上の理由から、詳細情報がマスクされるケースもあります。
また、必ずすべてのエラーを捕捉できるわけでもないので注意が必要です。
それでも、環境によっては非常に有用なデバッグ手段となります。

便利だけど注意も必要

windowオブジェクトは何でもできるように見えますが、やりすぎると予期しない挙動が起こるリスクがある点にも留意が必要です。
たとえば、グローバルスコープ への変数定義が多くなると、別のスクリプトと衝突しやすくなります。

また、alertやconfirmなどのポップアップを乱用すると、ユーザーは何度もクリックを強制され、操作性が悪化します。
適切なUIパーツを活用し、ポップアップを必要最小限にとどめる設計が大切です。

あまり多くの機能をwindowオブジェクトに頼りすぎると、コードの見通しが悪くなる恐れがあります。
モジュールやクラスなどを活用して、スコープを整理しましょう。

さらに、ブラウザによっては一部のwindow機能が動作制限される場合もあります。
ポップアップブロッカーやセキュリティ対策によって、開こうとしたウィンドウがブロックされることがある点には気を配りたいところです。

パフォーマンスを意識した使い方

windowオブジェクトを使う場面では、イベント処理の頻度 に注意してください。
resizeやscrollイベントは高頻度で呼び出される可能性があり、そのたびに重い処理をしているとブラウザがカクついたり、CPUリソースを消費しすぎたりします。

下記のように、debouncethrottle といったテクニックを導入することで、頻度を制御するのが一般的です。

let timer;
window.addEventListener("scroll", () => {
  if (timer) return;
  timer = setTimeout(() => {
    // 一定時間後に実行したい処理
    console.log("スクロールイベントを間引いて実行");
    timer = null;
  }, 200);
});

このように間隔を空けて処理を行うことで、パフォーマンスを確保できます。
実務ではReactなどのライブラリを使う場合も多く、その際にも内部で同様の対策が用いられることがあります。

エラーハンドリングの工夫

windowオブジェクトを使っていると、想定外の操作やブラウザ拡張の影響などでエラーが発生する場合があります。
特にlocationオブジェクトなどを操作するとき、ユーザーがすでにページを閉じる直前だったり、ネットワークが不安定でURLを変更できなかったりするケースが考えられます。

そういったときには try...catch を適切に使い、予期しないエラーを無視せずログを残すようにしておくと安心です。
また、ユーザーに対しては「エラーが起きました」程度のシンプルなメッセージを表示して、何が起こったのかをわかりやすく伝えることが重要です。

デバッグのポイント

windowオブジェクトに関して学んだことを実際に確認するときは、ブラウザの開発者ツールが便利です。
ChromeやFirefoxにはコンソールタブがあり、そこに window と入力すると、オブジェクトの内容を展開して見ることができます。

また、F12キーやCtrl+Shift+I(MacではOption+Command+I)などでデベロッパーツールを開き、console.logの出力や、DOMの要素構造を合わせて確認しながら作業すると効率的です。
これにより、想定外のプロパティ値が入っていたり、読み込み順に問題があったりする場合に素早く気づけます。

実務では複数のスクリプトが同時に読み込まれることも多いです。
グローバルに定義した変数名が重複すると上書きが起こる危険があるので、スコープ管理を考慮しましょう。

window.postMessageによるメッセージ通信

異なるオリジン間で安全にデータをやりとりする方法として window.postMessage が挙げられます。
たとえば、iframe内のスクリプトと親ページが通信をする場合、postMessageを使うと便利です。

// 子フレーム側
window.parent.postMessage("子フレームからのメッセージ", "https://example.com");

// 親ウィンドウ側
window.addEventListener("message", (event) => {
  if (event.origin === "https://example.com") {
    console.log("受信メッセージ:", event.data);
  }
});

クロスオリジンでの通信になるため、セキュリティを確保するためには、送受信先のドメイン(origin)を正しくチェックすることが大切です。
この仕組みを活用すると、マイクロフロントエンドなど、複数の独立したフロントエンドを連携させるシーンでも役立ちます。

まとめ

ここまで、JavaScriptの windowオブジェクト に関する基礎から具体例、そして実務での応用ポイントまで幅広く解説してきました。
初心者の方には少しボリュームが多かったかもしれませんが、その分、いろいろな機能が詰まっていることを感じていただけたのではないでしょうか。

複雑に思える反面、ブラウザ上で起きる出来事を司る中枢ともいえる存在なので、うまく使いこなすと開発の幅が広がります。
また、windowはグローバル領域でもあるため、他のスクリプトとの競合を避ける工夫も大切です。

学習を進める際は、まずはポップアップや簡単なイベントリスナーから始めてみるとよいでしょう。
最終的には、ページの遷移やストレージ管理、エラー監視といった高度な使い方まで一歩ずつ習得していけます。

本記事が皆さんのJavaScript学習や実務のヒントになれば幸いです。

JavaScriptをマスターしよう

この記事で学んだJavaScriptの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。