65

(たぶん) JavaScriptオブジェクトに変数を「保存」/「保存」することで、問題(ダイアログウィンドウからフォームが正常に送信された後にフロントエンドコンテンツを更新する方法)を解決しました。windowただし、私はJavaScriptの問題に慣れていないため、JavaScriptオブジェクトに変数を格納/保存することが、そのオブジェクトを使用するための「一般的な」/「適切な」方法であるかどうか疑問がありwindowます。それは...ですか?

たとえば、次のコードを使用します

$('.trigger').click(function() {
  window.trigger_link = this;
});

賢明ですか?

4

3 に答える 3

114

JavaScriptでは、グローバル変数は実際にはwindowオブジェクトのプロパティです。一方を使用することは、もう一方を使用することと同等です(そして交換可能です)。

グローバル変数の使用は確かに「一般的」であるため、問題はそれが「適切」であるかどうかです。一般に、グローバル変数は任意の関数からアクセスでき、複数の関数が同じ変数の読み取りと書き込みを試みるリスクがあるため、お勧めしません。(これは、JavaScriptだけでなく、あらゆる環境のあらゆるプログラミング言語に当てはまります。)


アプリケーションに固有の名前空間を作成して、この問題を解決します。最も簡単なアプローチは、変数をそのオブジェクトのプロパティとして使用して、一意の名前でグローバルオブジェクトを作成することです。

window.MyLib = {}; // global Object container; don't use var
MyLib.value = 1;
MyLib.increment = function() { MyLib.value++; }
MyLib.show = function() { alert(MyLib.value); }

MyLib.value=6;
MyLib.increment();
MyLib.show(); // alerts 7

別のアプローチは.data()、関連するDOM要素に変数をアタッチするために使用することです。これはすべての場合に実用的ではありませんが、グローバル名前空間に残さずにグローバルにアクセスできる変数を取得するための良い方法です。

于 2012-09-12T17:20:36.607 に答える
9

ここで実際に言及されていないこと、そしておそらくグローバルスコープキャリアとして使用しない理由 の最大の取引ブレーカーは、場合によっては凍結できる(書き込みできない)可能性があることです(そして私は本番ベースの経験から話しています)。window

良いパターンは、実際には、アプリケーションのすべての一般的なものに使用されるグローバル変数を作成することです。

var Application = {};
Application.state = { name: 'Application' }
.
.

javascriptで私にとって最良のパターンとして見つけたのは、Reduxを使用してグローバルな状態にすることです。

于 2018-08-12T10:44:01.937 に答える
2

アプリケーションで一意の名前空間を作成するための別のパターン。

(function myApp()
{
    var value = 5;
    function addToValue(x)
    {
         value += x;
    }
})()

後で関数/値にアクセスできるようにする場合は、次のようなオブジェクトにそれらを格納できます。

function myApp()
{
    this.value = 5;
    this.addToValue = function(x)
    {
         this.value += x;
    }
}
var myInstance = new myApp();
于 2017-07-16T05:38:03.653 に答える