2011-06-24 10 views
0

window変数のコードにコード自体がアクセスできないようにするにはどうすればよいですか?例えば閉鎖環境で機能を実行

var popup = function(msg){ alert(msg); }; 

(function(){ 
    window.x = 5; 
    popup("hi."); //does not work 
})(); 

alert(x) //does not return 5 

私はコードテスターを書くしようとしています。私はスコープとクラスについて読んできましたが、私はこれを理解するのに十分理解していません。

ありがとうございます!

+0

*とはどういう意味ですか?*動作しません。それはうまくいかないか、本当にうまくいかないのですか? –

+0

私の理想的な状況では、うまくいきません。しかし、それは実際に私がそれを実行するときに動作します。 – mattsven

+0

外部変数またはグローバル変数にアクセスできない何かを定義したいのですか? – Wiseguy

答えて

3

簡単な答えは、JavaScriptコードがグローバル変数にアクセスするのを防ぐことができないということです。これが「グローバル」と呼ばれ、JSプログラマーが適切なスコープ変数を主張する多くの理由の1つです。

A少し長い答え、

あなたのコードがコメントにあなたが言うことを私はあなたが意味を考えることであるとき、「動作しない」ので、あなたの例では、混乱して「私はこれが動作する必要はありませんが、それがありません」 。

JavaScriptでは、宣言されたスコープを「閉じる」ことができます。

JSランタイムは、現在のスコープ内の変数参照を最初に検索し、参照が見つからない場合は、親スコープ内、親スコープの親など、スコープが見つかるまで変数参照を検索します祖先はいない。最後に、グローバルスコープ(ブラウザーでは、ウィンドウスコープに対応)の参照を検索します。このため、のウィンドウスコープの変数はどこからでもアクセスできます。

変数が参照されているが宣言されていない(の変数キーワードで)変数が自動的にグローバルスコープに作成されるという追加の特徴があります。これが事実でない場合、JSはより良い言語になりますが、それは別の話です。

ビルドしたいテストスイートの種類はわかりませんが、テスト対象のコードで任意のグローバル割り当てを許可しないことで少しのQAを実行する必要があることは確かです。これは最近のベストプラクティス以上のものです。

以前のプロジェクトで使用した方法の1つは、テスト対象のコードを実行してコードをロードした後と実行した後にリストにマッチングする前に、グローバルスコープ内のプロパティを列挙することです。新しいグローバル変数が現れると、自動テストは失敗します。

1

windowで定義された変数はグローバルです。それらをアクセス可能にしたくない場合は、それらをグローバルに定義しないでください。

+0

例を挙げてください。 – mattsven

+0

@NeXXeuS:あなたの例を使って、 'window.x = 5;'を 'var x = 5;'に変更します。これは 'x'を関数のローカルスコープに置き、関数が期限切れになると終了します。 –

+0

@GeorgeCummins:私は、このコードを制御できないということを指摘しています。 –

関連する問題