Сходство между статическим и динамическим масштабированием - PullRequest
0 голосов
/ 12 декабря 2011

Есть ли сходство между статическим и динамическим масштабированием? Я едва могу найти что-либо.

Ответы [ 2 ]

0 голосов
/ 16 мая 2013

Насколько я знаю, между ними нет сходства. есть только разница между ними, как @Jules объяснил выше В статической области видимости имя ссылается на ближайшую привязку, идущую от внутренней к внешней области в тексте программы В динамическом определении имени имя относится к ближайшей привязке во время выполнения.

0 голосов
/ 12 декабря 2011

Статическая область видимости или лексическая область видимости означает, что место, где объявлена ​​переменная, может быть определено с помощью просмотра в окружающих областях.Динамическая область действия означает, что место, где объявлена ​​переменная, определяется динамически путем поиска стека вызовов.Например:

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 #.

...