Когда определяется Lexical Scope для функции внутри функции?

Я посмотрел на другие лексические вопросы об области применения в R, и я не могу найти ответ. Рассмотрим этот код:

f <- function(x) {
  g <- function(y) {
    y + z
  }
  z <- 4
  x + g(x)
}
f(3)

f(3) вернет ответ 10. Мой вопрос почему? В точке g() определяется в коде, z не было назначено никакого значения. В какой момент закрытие для g() создан? Это "смотрит вперед" на остальную часть тела функции? Это создано, когда g(x) оценивается? Если так, то почему?

1 ответ

Решение

Когда f запускается, первое, что происходит, это то, что функция g создан в fЛокальная среда. Далее переменная z создается по назначению.

В заключение, x добавляется к результату g(x) и вернулся. В тот момент, когда g(x) называется, x = 3 а также g существует в fЛокальная среда. Когда свободная переменная z встречается при выполнении g(x), R смотрит в следующую среду, вызывающую среду, которая fЛокальная среда. Находит z там и продолжается, возвращая 7. Затем он добавляет это к x который 3.

(Так как этот ответ привлекает больше внимания, я должен добавить, что мой язык был немного свободным, когда я говорил о том, что x "равно" в различных точках, которые, вероятно, не точно отражают задержку оценки аргументов Р. x будет равно 3, как только значение будет необходимо.)

Другие вопросы по тегам