Ответ 1
Lua - динамический язык, а функции - это своего рода значение, которое можно вызвать с помощью оператора ()
. Таким образом, вам не нужно пересылать декларацию функции так, чтобы убедиться, что переменная в области, когда вы ее называете, - это переменная, которую вы считаете.
Это не проблема для глобальных переменных, содержащих функции, поскольку глобальная среда является местом по умолчанию для поиска имени переменной. Однако для локальных функций вам необходимо убедиться, что локальная переменная уже находится в области действия в лексической точке, где вам нужно вызвать значение, которое она хранит, а также убедиться, что во время выполнения она действительно держит значение, которое можно вызвать.
Например, здесь пара взаимно-рекурсивных локальных функций:
local a,b
a = function() return b() end
b = function() return a() end
Конечно, это также пример использования хвостовых вызовов для бесконечной рекурсии, которая ничего не делает, но здесь речь идет о объявлениях. Объявляя переменные с local
, перед тем как либо будет храниться в ней функция, эти имена, как известно, являются локальными переменными в лексической области остальной части примера. Затем сохраняются две функции, каждая из которых ссылается на другую переменную.