2016-03-23 19 views
0

私の頭が回転しています.JavaScriptストア変数と「実行コンテキスト」と「実行コンテキストオブジェクト」とはどのように説明できますか?Javascriptの実行コンテキストと実行コンテキストオブジェクト

なぜコンソールに出力次のコードスニペットのプリントを行います。

ハロー引数

ハロー引数

var hello = 'hello is assigned'; 
 

 
function prison(hello) { 
 
    console.log(hello); 
 
    var hello; 
 
    console.log(hello); 
 
} 
 
prison('the hello argument');

ありがとう!

答えて

2

これは、実行コンテキストとは関係がなく、関数の変数スコープとは関係ありません。関数の引数として'the hello argument'を渡していて、関数の外で宣言されたhello varの代わりにローカルが使用されています。

var helloは何も実行せず、use strictまたはlinterを使用していた場合、おそらく警告(既存の変数を宣言しようとする)が発生します。

var hello = null;に変更すると、出力が変更されます。次のコードを持っていた場合

今、:

var hello = 'hello is assigned'; 

function prison() { 
    console.log(hello); 
    var hello; 
    console.log(hello); 
} 

prison(); 

...あなたは、両方のログのundefinedになるだろう。変数宣言を実行する前に、関数の先頭に移動されている - - これはvariable hoistingになりますので、コードは実際にはそれほどのように表示されます:

function prison() { 
    var hello; 
    console.log(hello); 
    console.log(hello); 
} 

helloは、両方のケースでundefinedです。

1

あなたの関数prison()が変数hello以上の閉鎖を持って、prison()var hello;は、新しい変数を作成していない、それはその変数使用していますので、関数がすでに定義されたグローバル変数helloがあることがわかりますので、あなたが得る2 the hello argument

しかし場合は、そこにあなたがprison()helloに掲揚されるだろうhelloの定義bcoz 2 undefinedになるだろうprison()前に定義されたhelloませんでした、それに設定値を持ちません。

関連する問題