85

Web全体で、window.location単なるではなく、膨大な数のJavaScriptプログラマーが書いているのを目にしlocationます。理由を誰かに説明してもらえないかと思いました。windowはグローバルオブジェクトであるため、含める必要はありません。つまり、人々が書いwindow.Math.floorたりnew window.Date()、を書いたりするのを見ないので、なぜそれが。で指定されるのか興味がありますlocation

location私はそれがあなたがいる窓の「特性」であると考えられていることを理解しています、それは私がある程度意味があると思います。しかし、それでも、グローバルオブジェクトを指定する理由はわかりません。locationそもそも、ページをリダイレクトせずに上書きすることはできません。

それで、これは私たちがJavaScriptを書く方法と統合されるようになるほど長い間使用されてきた単なる癖ですか、それともこのように物事を行うための具体的な理由がありますか?グーグルをチェックしましたが、残念ながら何も思いつきませんでした...

4

9 に答える 9

91

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

  1. 可能な限りグローバル変数を避けるのは良い習慣です。window.プレフィックスを使用すると、変数がグローバルであり、他の変数はそうではないことがわかります。
  2. Javascript のスコープの性質により、スコープ ツリーの上位に設定された変数をオーバーライドできます。これはvar location、包含スコープのどこかに設定でき (変数名として使用する可能性が低い単語ではありません)、代わりにそれに取り組んでいる可能性があることを意味します。

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

于 2011-01-17T00:34:00.783 に答える
18

誰か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
    })();

})();
于 2011-01-17T00:30:24.160 に答える
12

window.locationとネイティブMathDateオブジェクトには大きな違いがあります。つまりMath、 とDateはグローバル オブジェクトのプロパティとして存在するように指定されたネイティブ JavaScript オブジェクトであり、 はホスト オブジェクトwindow.locationのプロパティです(ホスト オブジェクトは、オブジェクトのいくつかの側面を表すオブジェクトです)。環境によって提供される環境であり、ネイティブ JavaScript オブジェクトと同じ規則の対象ではありません (他のホスト オブジェクトには、および任意の DOM 要素が含まれます)。window document

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

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

于 2011-01-17T10:22:37.197 に答える
6

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

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

于 2011-01-17T00:26:47.407 に答える
5

スタイルだけの問題ではありません。ウィンドウの読み込みイベントの後で、スクリプト要素をフラグメントに追加し、そのフラグメントをドキュメントに追加することで、ソーシャル メディア ボタンを非同期的にロードしようとしていました。Twitter の widgets.js はlocation.hrefいくつかの場所で使用され、IE 8/9 で次のエラーを引き起こしていました:メソッドまたはプロパティ アクセスへの予期しない呼び出し。理由はわかりませんが、これは別のページからのリンクを介してページにアクセスした場合にのみ発生します. script 要素を head に追加したり、 を使用したりするだけ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>
于 2012-12-18T19:48:23.063 に答える
3

windowオブジェクトはデフォルトの作業用ネームスペースであるため、とlocation等しくなりwindow.locationます。

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

于 2011-01-17T00:27:15.143 に答える
2

それはただのスタイルの問題です。

概念的には、またはとは異なり、は(ウィンドウはある場所にあります)locationのプロパティです。windowMathDate

于 2011-01-17T00:23:51.433 に答える
1

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

于 2011-01-17T00:27:06.717 に答える
0

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

于 2011-01-17T00:24:44.890 に答える