Статическая область видимости или лексическая область видимости означает, что место, где объявлена переменная, может быть определено с помощью просмотра в окружающих областях.Динамическая область действия означает, что место, где объявлена переменная, определяется динамически путем поиска стека вызовов.Например:
var x = 2;
function foo(){
return x;
}
function bar(...){
var x = 3;
print(foo());
}
bar();
При статической или лексической области видимости это напечатает 2. X внутри foo исходит из окружающей области.При динамическом определении объема это напечатает 3, потому что значение x определяется путем поиска в стеке вызовов в вызове функции bar.В этот момент определено значение x, поэтому используется значение x = 3.
Ранний Лиспс использовал динамическое определение области видимости для всех переменных, но с тех пор это широко расценивалось как ошибка.Поздние Лиспы и большинство других языков используют лексическую область видимости.Некоторые языки, такие как Common Lisp, предоставляют специальные переменные с динамической областью действия.Основные языки, такие как C # и Java, также имеют ограниченную форму динамической области видимости: обработчики исключений обычно имеют динамическую область видимости;если вы вызываете исключение, то вызываемый обработчик исключения динамически ищется в стеке, а не определяется статически структурой кода.Например:
try {
function foo(){
throw new Exception();
}
} catch (Exception e){ print "A"; }
try {
foo();
} catch (Exception e){ print "B"; }
Этот код будет печатать «B», а не «A».Обратите внимание, что вам нужно использовать лямбда-выражения для написания этого кода, например, в C #.