2016-09-29 5 views
0

次のjavascriptを実行したとき、b()のコンソールログが未定義に出力されることが予想されていました。 (私は名前を宣言しなかったので)。Javascriptコールスタック/実行コンテキストリファレンス

function b(){ 
    console.log(name); 
} 

function a(){ 
    var name = "rupesh"; 
    b(); 
} 

var name = "Demo"; 
a(); 

予想される出力:不定

実際の出力:デモ私はグローバル実行コンテキストは、JavaScriptの実行コンテキストに読んでいる

。実行コンテキストがグローバル実行コンテキストを探すことは言及されている。

私は正しく理解すると、関数a()と関数b()はスタック内で実行されます。それはどのように実行コンテキストに戻るのですか(データ構造の観点ではこれは起こりません)。

こんにちは。これがどのように機能するのか説明してください!

+1

巻き上げ:

ただ全体像を表示するために、それはランタイムがあなたのコードを「見る」方法です。 http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html – Will

答えて

1

次のjavascriptを実行すると、b()のコンソールログが未定義に印刷されることが予想されました。 (私は名前を宣言しなかったので)。

技術nameが宣言です。これは、ホイストと呼ばれています。だから、ランタイマーはすべてのvar宣言を「キャッチ」し、それらを関数の上に置きます(関数内にないので、グローバル名前空間にアタッチされます)。だから、それはこのようになるだろう:name変数と呼ばれているa()

var name; 
function b(){ 
    console.log(name); 
} 
... 

が、この場合"Demo"には、値が割り当てられています。 function a() {...}インサイド

もう一度nameと呼ばれる変数を割り当てるが、このようnameは、私はあなたがundefinedをするnameを期待したいので、あなたはすでに、それを考え出したと思います(グローバルnameを変更しないことを、それ以前にvarを持っています)。

最後にa()の内部でb()が呼び出されると、変数には"Demo"という値が割り当てられます。

var name; 

function b(){ 
    console.log(name); 
} 

function a(){ 
    var name = "rupesh"; 
    b(); 
} 

name = "Demo"; 
a(); 
+0

驚くべきほど説明できませんでした – TechnoCorner

+0

喜んで助けてください! :) –