質問: **両者の違いを知りたい** --- **Q1.「location.href」よりも「window.location.href」と書いた方が良いケースはある?** ・グローバルオブジェクトがwindowではない所からのリンクって例えばどんな時ですか? ・スマホのブラウザからのアクセスも、グローバルオブジェクトはwindow? --- **Q2.グローバルオブジェクト対象について** ・例えば、「aサイトからbサイトへ遷移」した場合、「location.href」のグローバルオブジェクトは「aサイト」「bサイト」の何れが対象? ・そもそも両者のグローバルオブジェクトが異なっていること自体が有り得ない?? --- **Q3.window以外のグローバルオブジェクトについて** ・例えば、Node.js経由で表示しているブラウザのグローバルオブジェクトはwindowですか? ・Node.jsの中のグローバルオブジェクトだけがglobal?
回答: A1. あります。 スコープ上に `window.location` 以外の変数 `location` が存在する場合があります。 ``` function foo(...) { let location = 'Tokyo'; // location と window.location は違う。 .. } ``` また、同名のローカル変数がない場合でも `window.location` と書いた場合と `location` と書いた場合でパフォーマンスが違うという話も聞いたことがあります。 > > グローバルオブジェクトがwindowではない所からのリンクって例えばどんな時ですか? > > > 質問の意味わかりません。 > > スマホのブラウザからのアクセスも、グローバルオブジェクトはwindow? > > > スマートフォンかどうかに関わらず、ウェブブラウザ環境でのメインスレッドのグローバルオブジェクトは `window` です。 ただし、ブラウザ環境でもワーカー内は `self` がグローバルオブジェクトになります。 A2. `window` グローバルオブジェクトは、ページ毎に異なるものが用意されます。ページA内のスクリプトから見える `window` と、ページB内のスクリプトから見える `window` は、別のものです。 (厳密にはブラウジングコンテキスト毎で、IFRAMEを持っているドキュメントとそのIFRAME内のドキュメントは別の `window` を持ちます) A3. Node.js の JavaScript 実行環境とブラウザの JavaScript 実行環境は何も関係がありません。Node.js ではいつでも `global`、ブラウザ内ではいつでも `window` `self` などです。