0

それらの違いは何ですか?
①関数のスコープ -->②[[スコープ]]---->③スコープ

var scope = 'window';
var someFunction = function(){
    something go here....
}

someFunction のスコープ
someFunction[[scope]]
ウィンドウ スコープ
はそうですか?

4

1 に答える 1

4

スコープ チェーンを理解したい場合は、Richard Cornford のJavaScript Closuresに関する記事、特にIdentifier Resolution, Execution Contexts and scope chainの部分を読む必要があります。

簡単に言うと、スコープ チェーンは、変数/アクティベーション オブジェクトから変数/アクティベーション オブジェクトに移動し、グローバル オブジェクトで停止します (グローバル オブジェクトは事実上、グローバル実行コンテキストのアクティベーション/変数オブジェクトであるため)。

したがって、次の場合:

var fred;

function foo() {
    alert(fred);
}

識別子fredは、グローバル変数/アクティベーション オブジェクト (グローバル コードの場合はグローバル オブジェクト自体) のプロパティになります。foo()が呼び出されると、グローバル オブジェクトを含むスコープ チェーンを使用して、新しい変数/アクティベーション オブジェクトが作成されます。識別子fredは最初に内部変数オブジェクトで解決され、そこには見つからないため、チェーンの次のオブジェクト (グローバル オブジェクト) が検索されます。

同様に:

function foo() {
    function bar() {
        alert(fred);
    }
    bar();
}

そのため、foo()が呼び出されると、次にbar( ) が呼び出され、fredは最初に bar の変数オブジェクト、次に foo、次にグローバル オブジェクトに対して解決されます。

実行コンテキストを理解すると、この「コンテキスト」の値を呼び出すことが誤解を招く理由もわかります。

于 2011-12-23T10:54:05.453 に答える