2012-03-29 16 views
1

今日、「javascriptのすべてがグローバルなので、関数のローカル変数にアクセスすることは可能です」と聞きました。関数の外部から関数のローカル変数にアクセスすることは可能ですか?

私が知る限り、変数のスコープ外からローカル変数にアクセスすることはできません。例えば

function f() 
{ 
    var myvar = "something"; 
} 

myvar = "c"; // i'm not accessing myvar in f(); 

私はまた、MYVARにアクセスするためにため(ウィンドウ内のVAR i)をを使用することが可能だということを聞きました。私は言語の作者ではないので、それが不可能であることを確認したい。

更新日:

は、私は彼にコードスニペットを尋ね、そしてここで私が受け取ったものです。これは、変数にアクセスしていないです

var person = { 
    whoIs : function() 
    { 
     var name = "name"; 
     return name; 
    } 
}; 


var str = "TEST:\n"; 

for(var n in person) 
{ 
    str += n; 
    str += " = [" + person[n] + "]\n"; 
} 

// perform regular exp. to get the value of name variable. 


alert(str); 

.........単に機能は、開発者が間違っていたことが

+1

* *これは間違いなく間違っている「それはJavaScriptですべてがグローバルであるため、関数のローカル変数にアクセスすることが可能です」。 – Behrang

+0

これを少し拡張するために、JavaScriptは非常に奇妙なスコープを持っています(あなたがそれに慣れていない場合)。しかし、 "JavaScriptのすべてがグローバルです"というのは間違っています。同様に、間違っている開発者から遠ざかります。 – Corbin

+1

その男に尋ねる*「JavaScriptを最後に使ったのはいつですか?」* – Joseph

答えて

6

...どのように見えるかを印刷しています。それら2つのmyvarは異なっています。外側のものはwindow.myvarに相当しますが、内側のものはfの中にしかありません。

編集:非常に単純な例:http://jsfiddle.net/mRkX3/

編集2:

のECMAScript標準からの引用:

変数文がFunctionDeclarationの内部で発生した場合は、変数はで定義されています10.1.3節で説明したように、その関数内の関数ローカルスコープです。それ以外の場合は、グローバルスコープで定義されます(つまり、セクション10.1.3で説明されているグローバルオブジェクトのメンバーとして作成されます)。プロパティ属性{DontDelete}を使用します。実行スコープが入力されると、変数が作成されます。ブロックは新しい実行スコープを定義しません。プログラムとFunctionDeclarationのみが新しいスコープを生成します。変数は、作成時に未定義に初期化されます。変数が作成されたときではなく、VariableStatementが実行されるとき、Initialiserを持つ変数にはそのAssignmentExpressionの値が割り当てられます。その記事はdeadlink(:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdfライブリンク)を参照しているもののhttp://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoistingで見つかった

2

はい、あなたはそれについて正しいです。関数スコープ内で宣言された変数は関数からアクセスできません。関数がmyvarを返した場合、変数に直接アクセスすることはできませんが、変数に直接アクセスすることはできません。

3

あなたのケースではmyVarは機能の範囲内にあり、定義されている場合はvarで外部にはアクセスできませんが、定義されていない場合はmyVarをグローバルオブジェクト(ウィンドウ)それは多くの問題につながる可能性があります。それは関数内で定義されていないため

function(f) { 
myVar = "hello" 
} 

この場合、あなたは、myVarを見つけることができます。

4

通信の故障のようです。私は、関数内からグローバル変数を定義することができることを、ウィンドウオブジェクトにアタッチすることによって、彼がポイントを作ろうとしていたことに賭けています。試してみてください:

function f() 
{ 
    window.myvar = "something"; 
} 

myvar = "c"; // overwriting "something" 
2

を(それらを進めるvarせずに)、彼は明らかにグローバルとして宣言する必要があなたの関数の変数にカウントされ、彼が使用した例(for(var i in window))から判断します。

この場合、定義された変数のすべてがオブジェクトのためにバインドされているため、ウィンドウオブジェクトを単にトラバースするだけで簡単にアクセスできます。ただし、varを使用してローカル関数の変数を宣言すると、関数自体でのみ使用できます(windowオブジェクトには含まれません)。あなたの例では

3

function f(){ 
    var myvar = "something"; 
} 

myvar = "c"; //nope, they are different. 

myvar = "c"f()内部myvarと同じではありませんこれは、window.myvarを参照しています。関数の中で宣言されていない限り、関数内の変数にアクセスすることはできません。

var myvar; 

function f(){ 
    myvar = "something"; 
} 

myvar = "c"; //now it changes "something" to "c"! 
-1
function f() 
{ 
    var myvar = "Moon"; 
} 

f(); 

myvar = "Sunlight"; 
関連する問題