2016-09-28 4 views
1

JSのレキシカルスコープと実行コンテキストについて学習しています。外部環境を参照するときに、この特定の変数にアクセスできないのはなぜですか?

キーワードthisについての理解は限られていますが、どの関数の現在の実行コンテキストでもすべての変数を参照していることがわかります。

function a(){ 
    function b(){ 
    console.log(this); 
    } 
    var myVar = 2; 
    b(); 
} 
var myVar = 100; 
a(); 
:私は、この例では1

今の値に割り当てられますmyVarにするコンソールログを取得します、ここで

function b(){ 
    console.log(this); 
} 
var myVar = 1; 
b(); 

この例を考えてみましょう

関数bが呼び出されると、100に割り当てられたmyVarへの参照が表示されます.2に割り当てられたmyVarへの参照がないのはなぜですか?

'this'は現在の関数のレキシカル環境を参照していませんか?この場合、関数bは関数aで囲まれ、地球環境で囲まれていません。

答えて

4

ご理解のthisは完全に間違っています。

thisの値は、(通常)関数の呼び出し方法に依存します。 (詳細は、How does the “this” keyword work?を参照してください)。

あなたはしている場合:ブラウザで

  • あなたのJSは、関数が
明示的なコンテキストで呼び出され
  • (それがあるべき)strict modeで実行されていません

    ... thiswindowオブジェクトになります。


    通常、変数が宣言されると、変数は宣言されたスコープ内にのみ存在します。どのオブジェクトのプロパティでもありません。

    は一つの例外がある:変数はグローバルスコープ内で宣言され

    (すなわち、任意の関数の外部又はlet又はvar関数内なし)、それはまた、windowオブジェクトのプロパティになります。


    あなたが見ている効果は、これら2つのものの組み合わせです。

    b();にはコンテキストがないため、thiswindowです。 var myVar = 100;はどの関数の外にもあります。したがって、グローバルであるため、windowというプロパティがあります。

  • +0

    は、関数aのコンテキストではbではありませんか?したがって、関数aの外部環境への参照として関数bを使用しますか? –

    +0

    @ user3882106 - いいえ。私が言ったように、コンテキストは宣言されている場所ではなく関数の呼び出し方法によって決まります。 http:// stackoverflowを参照してください。com/questions/3127429/how-does-the-this-keyword-workコンテキストとスコープを混同しないでください。 – Quentin

    関連する問題