2

次のコードでは:

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 は test にスコープされており、ここでコールバック関数が定義されています。cb()logCb() 関数は x 変数にアクセスできないため、行にエラーがスローされると予想していました。

しかし、そうではありません。なんで?コールバック内の参照は割り当て中に作成され、実行中には作成されないようです-巻き上げを検討する場合、これは理にかなっていると思います-つまり、コンパイル中に、コールバック関数が「テスト」の先頭に巻き上げられ、テストの中で割り当てが発生します範囲?

実行はスコープと同じではないことを読みました。この記事: 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はコールバックがテスト関数内から呼び出されることを暗示しているようです。

コールバック関数が呼び出された場所に関係なく、テストのスコープが設定されているように思われるためです。

私の質問は次のとおりです。

スコープと実行コンテキストを考えるとき、コールバック関数は定義と呼び出しの観点からどのように処理されますか?

4

3 に答える 3

1

スコープは、関数が呼び出される場所ではなく、関数が作成される場所によって決まります。

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

于 2016-07-23T09:44:37.380 に答える
1

スコープと実行コンテキストを考えるとき、コールバック関数は定義と呼び出しの観点からどのように処理されますか?

関数スコープは、レキシカル環境で物理的に存在する場所に基づいています

説明:コールバックは関数test()に字句的に存在するため、常にそれ自体の中で (存在する場合) this値を見つけようとします。)

テスト関数LogCb関数は同じ方法に従います。この場合、外部環境はグローバルになります

エンジンは、実行コンテキストとは別にスコープをどのように追跡しますか?

レキシカル環境:記述したコード内に何かが物理的に存在する場所。

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

あなたのコードには多くの字句環境があります。どちらが現在実行されているかは、実行コンテキストを介して管理されます。コードに記述した内容を超えるものを含めることができます。

実行コンテキストが作成されるたびに、次の 3 つのことが利用可能になります。

  1. グローバル オブジェクト (ウィンドウ) : グローバル スコープ内の任意の変数または関数は、ウィンドウ オブジェクトにリンクされます。
  2. 'これ'
  3. 外部環境

したがって、現在実行中の実行コンテキストに応じて、コード内の物理的または字句的に存在する場所によって、これらのことは異なります。たとえば、 の外部環境cbfunction test()

于 2016-07-23T07:42:16.957 に答える
1

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

コンテキストは、次のいずれかの方法になります。

  1. new を使用して一時オブジェクトが作成され、コンテキストとして関数に渡されます

  2. オブジェクト a.getValue() を介して関数を呼び出します。getValue はコンテキストを取得します

  3. 上記の 2 つのいずれもがグローバル オブジェクト、つまり window を渡さない場合

于 2016-07-23T09:51:44.827 に答える