Еще одна причина: совсем не ясно, являются ли вложенные функции полезными. Двадцать с лишним лет назад я занимался крупномасштабным программированием и обслуживанием в (VAX) Pascal. У нас было много старого кода, который интенсивно использовал вложенные функции. Сначала я подумал, что это круто (по сравнению с K & R C, в котором я работал раньше), и начал делать это сам. Через некоторое время я решил, что это катастрофа, и остановился.
Проблема заключалась в том, что функция могла иметь большое много переменных в области видимости, считая переменные всех функций, в которые она была вложена. (У некоторого старого кода было десять уровней вложенности; пять были довольно распространенными, и пока я не передумал, я сам кодировал несколько последних.) Переменные в стеке вложений могли иметь одинаковые имена, так что «внутренние» функции локальных переменных может маскировать переменные с тем же именем в более «внешних» функциях. Локальная переменная функции, которая в C-подобных языках является полностью частной для нее, может быть изменена путем вызова вложенной функции. Множество возможных комбинаций этого джаза было почти бесконечным, и кошмар, который нужно постигать при чтении кода.
Итак, я начал называть эту программную конструкцию «полуглобальными переменными» вместо «вложенных функций» и говорить другим людям, работающим над кодом, что единственной вещью, которая хуже глобальной, является полуглобальная переменная, не создавать больше. Я бы запретил это на языке, если бы мог. К сожалению, такой опции для компилятора не было ...