Я пытаюсь понять правила области видимости JavaScript. То, что я прочитал в учебниках и документации, путается.Контекст JavaScript и контекст выполнения
Мне кажется, что JavaScript - это статически (или лексически) язык с областью - при попытке привязать имя переменной к переменной (определению) используется лексическая структура кода.
Контекст исполнения похоже на стек стека в стеке вызовов. Каждый контекст выполнения имеет переменный объект, на котором определены все локальные переменные (связанной функции). Эти переменные объекты связаны между собой, чтобы обеспечить «цепочку областей видимости» из объекта переменной в верхней части стека объекту переменной в нижней части стека (объект окна). Эта цепочка областей поиска выполняется сверху вниз, привязывая имена переменных к переменным. Это очень похоже на языки с фиксированным охватом, такие как C/C++/Java.
Существует, по-видимому, одно важное отличие по отношению к C/C++/Java - возможно получить доступ к переменной, определенной в функции, стек стека которой больше не находится в стеке вызовов, как показано в примере ниже:
var color = "red";
var printColor;
function changeColor() {
var color = "green";
printColor = function(msg) {
alert(msg + color);
}
printColor("in changeColor context, color = "); // "green"
}
changeColor();
// stack frame for "changeColor" no longer on stack
// but we can access the value of the variable color defined in that function
printColor("in global context, color = "); // "green"
Есть ли у меня это право? Есть ли другие проблемы, о которых я должен знать?
Заранее спасибо
Очень подробный пост, посвященный HN сегодня, который затрагивает это: [Что такое контекст выполнения и стек в JavaScript?] (Http://davidshariff.com/blog/what-is-the-execution-context-in- javascript /) –
Это называется * замыканием *. Функция, которую вы назначили 'printColor', имеет доступ ко всем переменным, определенным в' changeColor', даже после завершения функции. Я не знаю, как это происходит в C. –
@FelixKling почти. однако changeColor также определяется в глобальном масштабе, поэтому его область никогда не будет собрана мусором. – webduvet