О цепочке областей действия Javascript - PullRequest
0 голосов
/ 23 декабря 2011

какая разница между ними?
Область действия функции -> ② [[scope]] ----> copescope

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

область видимости someFunction
someFunction [[scope]]
область видимости
это верно?

1 Ответ

4 голосов
/ 23 декабря 2011

Если вы хотите понять цепочку областей видимости, вам следует прочитать статью Ричарда Корнфорда о JavaScript Closures , в частности, часть о Разрешение идентификатора, контексты выполнения и цепочки областей действия .

Вкратце, цепочка областей действия перемещается от переменной / объекта активации к переменной / объекту активации, останавливаясь на глобальном объекте (поскольку глобальный объект фактически является объектом активации / переменной для глобального контекста выполнения).

Так, в случае:

var fred;

function foo() {
    alert(fred);
}

Идентификатор fred становится свойством глобальной переменной / объекта активации (который в случае глобального кода является самим глобальным объектом).Когда вызывается foo () , создается новая переменная / объект активации с цепочкой областей действия, которая включает в себя глобальный объект.Идентификатор fred сначала разрешается для объекта внутренней переменной, и, поскольку он там не найден, выполняется поиск следующего объекта в цепочке (глобального объекта).

Аналогично для:

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

Итак, когда вызывается foo () , он вызывает bar () , и теперь fred разрешается сначалапеременный объект bar, затем foo, затем глобальный объект.

Как только вы поймете контекст выполнения , вы также поймете, почему вызов значения this"context"вводит в заблуждение.

...