Если вы хотите понять цепочку областей видимости, вам следует прочитать статью Ричарда Корнфорда о 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"вводит в заблуждение.