web-dev-qa-db-ja.com

window.locationと場所のみ

Web全体で、単なるlocationではなく_window.location_を作成しているJavaScriptプログラマーが多数います。理由について誰かが説明してくれるかどうか気になった。 windowはグローバルオブジェクトなので、含める必要はありません-そうではありませんか?つまり、人々が_window.Math.floor_やnew window.Date()を書くのを見ないので、なぜlocationで指定されるのか知りたいです。

locationは、あなたがいるウィンドウの「プロパティ」であると考えられていることを理解しています。しかし、それでも、グローバルオブジェクトを指定する理由はわかりません。そもそもlocationを上書きすることはできません。ページをリダイレクトせずに上書きすることはできません。

それで、これは、JavaScriptの記述方法と統合されるほど長く使用されてきた奇妙なことですか、それとも、この方法で何かを行う明確な理由がありますか?私はグーグルをチェックしたが、悲しいかな、何も思いつかなかった...

73
Reid

私のコードでは常に2つの主な理由からwindow.locationを使用しています。

  1. 可能な限りグローバル変数を回避することは良い習慣です。 window.接頭辞を使用すると、変数がグローバルであり、他の変数はグローバルでないことがわかります。
  2. JavaScriptのスコープの性質により、スコープツリーの上位に設定された変数をオーバーライドできます。これは、包含スコープのどこかにvar locationを設定でき(Wordが変数名として使用される可能性は低いわけではない)、代わりにそれを処理することを意味します。

私にとって、コーディングの目的を明確にすることは非常に重要です。バグを書くことを避け、バグを見つけるときに役立ちます。

70
lonesomeday

誰かがスコープチェーンのどこかにlocation変数を定義した場合の一部の安全のため。 window.locationは、windowのプロパティへの明示的な参照にします。

例:http://jsfiddle.net/dr6KH/

(function() {
    var location = 'new value'; // creating a local variable called "location"

    (function() {
        alert(location);  // alerts "new value"

        alert(window.location);  // alerts the toString value of window.location
    })();

})();
14
user113716

window.locationのプロパティとして存在するように指定されているネイティブのJavaScriptオブジェクトであるMathDateは、window.locationとネイティブのMathオブジェクトとDateオブジェクトの間に大きな違いがあります。 windowHost object(Hostオブジェクトは、環境によって提供される、環境の一部の側面を表すオブジェクトであり、ネイティブJavaScriptオブジェクトと同じルールの対象ではありません。他のHostオブジェクトには、documentおよびDOM要素)。

ブラウザーのwindowには2つの目的があります。1つ目は(詳細に指定された)ECMAScriptグローバルオブジェクトとして機能し、2つ目はブラウザー環境に関する情報を提供するHostオブジェクトとして機能します。 Hostオブジェクトキャパシティでwindowを使用する場合は、明示的にwindow.接頭辞を付けることをお勧めします。locationが機能しないという事実は、windowの統合失調症の性質による偶然です。また、他の回答で指摘されているように、これには、現在のコンテキストに別のlocation変数が存在する場合にユーザーを保護するという利点もあります。

DateまたはMathの前にwindow.を付けないことの1つの理由は、そうすると、ブラウザー以外の環境では機能しないコードが作成されるためです。他の環境では、通常、グローバルオブジェクトのエイリアスとしてwindowを提供していません。

9
Tim Down

コーディングの一部は明快さです。数学や日付とは異なり、場所は概念的にはウィンドウのプロパティであるため、コードを含めるとコードがより明確になります。窓。"プレフィックスは、縮小のために削除するのが理想的です。

その理由の多くは歴史的であるとあなたはおそらく正しいです。 JavaScriptには、コピーと貼り付けの長い歴史があります。

6
fuzzyTew

常にスタイルの問題ではありません。ウィンドウのロードイベントの後に、スクリプト要素をフラグメントに追加し、そのフラグメントをドキュメントに追加することで、ソーシャルメディアボタンを非同期でロードしようとしました。 Twitterのwidgets.jsはいくつかの場所で_location.href_を使用しており、IE 8/9:への予期しない呼び出しがメソッドまたはプロパティへのアクセスを引き起こしています。 理由はわかりませんが、これは別のページからリンクを介してページにアクセスした場合にのみ発生します。スクリプト要素をヘッドに追加するか、または_window.location.href_を使用した場合、これは発生しないため、IE 8/9およびcreateDocumentFragment()を使用すると、奇妙なように見えます。

例:

_<a href="http://Twitter.com/share" class="Twitter-share-button" data-url="http://www.stackoverflow.com">Tweet</a>
<script>
(function (d, t) {
    var head = document.getElementsByTagName('head')[0];
    var frag = d.createDocumentFragment();
    var s = d.createElement(t);
    s.async = true;
    s.src = 'http://platform.Twitter.com/widgets.js';
    frag.appendChild(s);
    head.appendChild(frag);
} (document, 'script'));
</script>
_
5
rhurkes

windowオブジェクトはデフォルトの作業名前空間であるため、locationwindow.locationと等しくなります。

locationの使用は少し曖昧だと思います。明確にするためにwindow.locationを使用してください。

3
Jacob Relkin

それは単なるスタイルの問題です。

概念的には、locationwindowMathとは異なり、Date(ウィンドウはある位置にあります)のプロパティです。

2
SLaks

locationはwindowオブジェクトのプロパティなので、window.locationをリクエストすることで取得できます。ただし、オブジェクトを指定しない場合、JavaScriptはウィンドウオブジェクトが必要であると想定します。したがって、場所を要求するだけでwindow.locationを要求するのと同じです。

1
arlomedia

それらは実際には同一です。技術的には、 "window" オブジェクトIS Javascript変数のルートスコープと同じです。

0
Adam Batkin