2016-07-23 3 views
1

Javascript:グローバル実行コンテキストを持つコールバック関数がスコープ変数にアクセスするのはなぜですか?次のコードで

function test() { 
    var x = 5 // scoped to test function 
    console.log(this); // global object 
    logCb(function(){ 
     console.log(this); // global object 
     console.log(x); 
    }) 
} 

function logCb (cb) { 
    console.log(this); // global object 
    cb() // This still seems to execute within the test function scope? why... 
} 

test() 

xはテストするためにスコープされ、コールバック関数が定義されているところです。 logCb()関数はx変数にアクセスできないため、cb()行にエラーがスローされると思います。

ただし、これは該当しません。どうして?コールバック内の参照は、割り当て中に作成され、実行中ではないようです - 巻き上げを検討すると、つまりコンパイル時にコールバック関数が 'テスト'の先頭に持ち上げられ、テスト内で割り当てが行われる範囲?

私は実行がスコープと同じではないことを読んでいます。この記事のhttp://ryanmorr.com/understanding-scope-and-context-in-javascript/では、この文scope pertains to the variable access of a function when it is invoked and is unique to each invocationは、コールバックがテスト関数内から呼び出されたことを暗示しているようです。

コールバック関数がどこで呼び出されても、まだテスト対象になるはずです。

コールバック関数が定義の面で取り扱われ、その後、スコープと実行コンテキストを考える際に呼び出している方法:

私は私の質問があると思いますか?

+0

を渡していない場合は、コンテキスト

  • を取得し、あなたがJavaScriptでのクロージャについて聞いたことがありますか? –

  • +0

    関数のスコープは、どこから呼び出されたかではなく、*宣言された場所に基づいています。関数の 'this'はスコープと無関係で、関数の呼び出し方法*に基づいています。 – nnnnnn

    +0

    @RajaprabhuAravindasamy。だから、コールバックはテストオーバークロージャを持っていますか? –

    答えて

    1

    スコープと実行コンテキストについて考えると、定義の点でコールバック関数がどのように処理され、次に 呼び出しが呼び出されますか?

    関数スコープは、それが字句環境内に物理的に存在する場所に基づいています

    説明:それは常に見つけようとしますので、コールバックは、機能テスト()で字句的に存在し、自体内こののいずれかの値(存在する場合)それ以外の場合は(この場合、機能試験ある)外環境におけるその値

    が表示されますテスト機能LogCb機能は同じ習慣に従います。この場合、外部環境は、がグローバル

    どのようにエンジンを個別に実行 コンテキストにスコープを追跡しないのだろうか?

    レキシカル環境:あなたが書いたコードに何かが物理的に存在するところ。

    実行コンテキスト:実行中のコードを管理するためのラッパー。

    あなたのコードには、レキシカルな環境がたくさんあります。どちらが現在実行されているかは、実行コンテキストによって管理されます。コードに書かれていることを超えたものを含めることができます。

    実行コンテキストは、私たちは私たちに利用可能な3つの事柄持って作成されるたびに:

    1. グローバルオブジェクト(ウィンドウ):グローバルスコープ内のすべての変数や関数ウィンドウオブジェクトにリンクされているが
    2. 「は、この」
    3. 外部環境

    だから、現在実行されている実行コンテキストに応じて、これらのものは、それが物理的にまたはコードで字句的に存在する場合ごとに異なります。例えば、cbの外部環境はfunction test()

    +0

    エンジンは実行コンテキストとは別にスコープを追跡していますか? –

    1

    です。スコープは、機能がの場合は、が呼び出された場所ではなく作成された場所によって決まります。

    logCbに渡す機能は、testの内部に作成されるため、testのスコープにアクセスできます。

    +0

    あなたはGoogle V8エンジンがこれを強制する方法を説明する良い方法を知っていますか? –

    1

    関数がjavascriptで呼び出されると、コンテキストが渡されます。

    コンテキストは、新しい使用して、次の方法

    1. のいずれかにすることができ、一時オブジェクトが作成され、それが(オブジェクトa.getValueを経由して関数を呼び出す機能

    2. にコンテキストとして渡されます)。 getValueは、上記2のいずれもグローバルオブジェクト、すなわちウィンドウ

    関連する問題