Переменные, которые ссылаются на функции или объекты, по существу указывают на ячейки памяти . Когда переменная переназначается, то, что находится в той области памяти, на которую она указывала, не изменяется - просто указанный объект будет в конечном итоге собираться мусором, как только ничто в любом месте в скрипте больше не может ссылаться на него.
Таким образом, ninja = {}
не меняет объект, которым изначально был ninja
. Поскольку samurai
имеет ссылку на ninja.chirp
, функция ninja.chirp
не будет собирать мусор - или, по крайней мере, пока, пока samurai
еще существует.
Функция chirp
или signal
может вызывать себя с помощью signal(n - 1)
, потому что это именованная функция - она называется signal
, поэтому она может ссылаться и вызывать себя, используя свое имя функции. У анонимных функций нет имен, и поэтому они не могут ссылаться на себя таким образом.