2011-10-31 6 views
0

実際に何かを尋ねる前に、私は先に進んで理論的な質問をします。しかし、それは後でウェブサイトに実装されるかもしれません。グローバル変数を一時的にローカルスコープに置き換えます。

とにかく、私は変数、任意の変数を持っています。それがaで、そのスコープがグローバルであるとしましょう。今、特定の関数については、その変数の値をグローバル値以外の値に設定したいのですが、それに基づいてにはの値をグローバルに変更しません。たとえば、次のように

a = {something: "Safe", other: "Foo"} 
function hello(){ 
    var a = a.other; // Foo 
    a.something; // Undefined 
} 
a.something; // Safe 
a.other; // Foo 

上記のコードの問題は、私は機能でvar aを定義するとき、それはすでにそれを設定する前に、ローカルでグローバルaの値をクリアしているということです。つまり、Can't access property [other] of undefined [a]のようなものを返します。

また、aはまだaである必要があります(別の変数名を使用することはオプションではなく、少なくとも理想的ではありません)。実際には、グローバルaは、helloからにアクセスできません。

編集:windowもミラノJaricの答えについて、nullで上書きされます。

ありがとうございます!

答えて

1

ですこれは私が探していたものです...今、前私は尋ねる前に私が答えを持っていたと思う、私はしなかった、私はミラノジャリックの答え(感謝btw)に基づいて具体的な解決に到達することができた。

a = {something: "Safe", other: "Foo"} 
function hello(b){ 
    var window = null; 
    var a = b; // a.other; 
    a.something; // Undefined 
} 
a.something // Safe 
a.other // Foo 

hello(a.other) 

(私は本当に機能の外に出ることができなかったかどうかは言いませんでした)。

+0

それは私があなたが元の質問で尋ねることを理解したものではありません。あなたがやっていることは 'a.other'に割り当てられたオブジェクトへの参照を渡すことです、グローバル* a *へのアクセスを防ぐ方法を依頼していましたが、そのプロパティを参照していました。 – RobG

+0

@RobG:このコードとこのコードだけを見ると、ほとんど同じです。私は* one *プロパティにアクセスする必要があり、そこにアクセスしました。他の 'a'プロパティ/メソッドへのアクセスも防止されます。それ以外に、本当に他の方法はありません。物事は不可能ではない*。 – JCOC611

+0

* ab *によって参照されるオブジェクトが実際に* ab *によって参照されていることを発見するには、いくつかの前提があればそれほど難しくない推測が必要です(つまり、他の* a * 、あいまいさによるセキュリティは健全なポリシーではありません)。 – RobG

3

すべてのグローバルは少しここにコードを変更すると、ウィンドウオブジェクトを使用してアクセスすることができますが、一例

a = {something: "Safe", other: "Foo"} 
function hello(){ 
    var a = window.a.other; // Foo 
    console.log(window.a.something); // Safe 
} 
a.something; // Safe 
a.other; // Foo 

hello(); 

または

a = {something: "Safe", other: "Foo"} 
function hello(){ 
    var a = this.a.other; // Foo 
    delete a; 
    console.log(this.a.something); // Safe 
} 
a.something; // Safe 
a.other; // Foo 

hello(); 
+0

私はゲームをより面白くするつもりです。 let'letは、 'var a = window.a.other、window = null'という関数の中でこれをしたと言っています。 (私はウィンドウにアクセスすることを許可することはできません...)任意の回避策ですか? – JCOC611

+0

:)考えて... –

+0

使用できるこのインスタンスもありますが、私はあなたの答え、素敵な思考の中で関数の署名を変更しているのを見ています:) –

1

ここでは、その範囲がグローバルであるとします。

"aはグローバル変数です"という意味です。

は...特定の機能のために、私はそれがグローバルな値だ以外 何かにその変数の値を設定し、それに基づいて、および は世界的にその値を変更せずにしたいです。

不可能です。スコープチェーン上にある同じ名前の変数を作成することはできますが、変数オブジェクト(スコープチェーン上の識別子解決に使用されるオブジェクト)のプロパティを条件付きで作成することはできません。ローカル変数は宣言することができます。つまり、コードが実行される前に存在し、条件付きにすることはできません。宣言されていない識別子に直接割り当てることができます。

[切り取らコード]

上記のコードの問題は、私が 機能でVAR aを定義するとき、それはすでにそれをローカルに設定する前に、グローバル の値をクリアすることです。

コードでは、aの値を決して「クリア」しません。識別子がグローバル変数ではなく、その変数に解決されるようにローカル変数aを作成します。ここでも、まだ(ので、別の変数名を使用して オプションではありませんか、である必要があり

var a = 'whatever'; 
var myFunction = (function(global) { 
    return function() { 
    var a; // local a 
    global.a; // global a 
    } 
}(this)); 

:2 betweent区別するために、あなたはグローバルオブジェクトのプロパティとしてグローバルaにアクセスすることができます少なくとも理想的なものではない)。実際には、グローバル関数はhello関数からアクセスできないようにする必要があります。 それはES5 strictモードではほとんど可能かもしれませんがインポッシブル

は、グローバルは別の関数内で、グローバルオブジェクトへの参照を取得することはできませんアクセスしようとするコードを提供しました。

しかし、私はあなたがそれを保証できるとは思わない。

関連する問題