2013-11-01 11 views
63

私はJavaScriptに新しいですし、私は、次の、ローカルおよびグローバル変数のスコープにいくつかの練習をしていたが、私のコード(fiddle)であります定義されていないとしてmynameを示しています。だから私の混乱はなぜmynameのグローバルインスタンスにアクセスすることができないと私はmyname関数内で定義されていない場合、正常に動作します。はJavascriptがローカルおよびグローバル変数の混乱

+1

** alert(window.myname); **次に値を取得します –

+0

@dholakiyaankitまだwindow.mynameを使用しようとしましたが、未定義と言っています... –

+0

@BharatSoni window.mynameは私の作品ですブラウザ。 – EmptyArsenal

答えて

6

グローバル変数に代わるものではありません。起こっているのは "可変ホイスト"と呼ばれるものです。つまり、関数の先頭にvar myname;が挿入されます。あなたがそれら を使用する前に、必ずあなたの変数を初期化する - これを試してみてください。JavaScriptで

var myname = "initial"; 
 

 
function c() { 
 
    alert(myname); 
 
    myname = "changed"; 
 
    alert(myname); 
 
} 
 

 
c();

+0

私は値を変更しようとしているだけではありません。グローバル変数自体の価値を変えているのですが... "WHY"というコンセプトを理解したいのですが... –

+0

これはアラートの問題を修正します定義されていませんが、グローバル変数 'myname'だけを使用しているので、ローカル変数は削除されます。 – EmptyArsenal

+0

グローバル変数を置き換えません。起こっているのは "可変ホイスト"と呼ばれるものです。つまり、myname var mynameです。関数の先頭に挿入されます。変数を使用する前に常に変数を初期化しておいてください。これは私が理解しているhttp://stackoverflow.com/questions/11938961/understanding-global-local-scope-in​​-javascript?rq=1 –

42

、変数の宣言は、自動的に関数の先頭に移動されます。したがって、通訳者は次のように見えるようになります。

var myname = "initial" 
function c(){ 
    var myname; 
    // alerts undefined 
    alert(myname); 
    myname = "changed"; 
    // alerts changed 
    alert(myname); 
} 
c(); 

これは「ホイスト」と呼ばれます。

ホイストと、変数のスコープが宣言されている関数であるため、この混乱を避けるために関数の先頭にすべての変数をリストするのが標準的な方法です。

+0

を参照することができます。ローカル変数と同じ名前のグローバル変数にアクセスする方法.. ?? –

+2

あなたは 'window.myname'を実行することによってそれにアクセスできるはずです。ここで参照してください:http://stackoverflow.com/questions/15826751/access-overridden-global-variable-inside-a-functionしかし、グローバル変数は通常、良い習慣とはみなされません。ほとんどの場合、グローバルオブジェクトとそれを介してアクセスします。すなわち 'var me = {myname:" initial "}'を呼び出し、関数内で 'me.myname'を呼び出します。 – EmptyArsenal

+1

変数の宣言が上に移動するとは言いません。たとえば、10行目にvar myname = "initial"と書かれている場合、1行目のvar myname = "initial"とは異なりますが、実際にはvar mynameが1行目で、 10には値が割り当てられます。つまり、myname = "initial" –

関連する問題