При создании экземпляра функции с именем — имя после function
ключевого слова, то есть — то, что имя связанного внутри функция как ссылка на себя. Вне функции функция, имя не отображается, если функция не создана в заявлении объявления функции. В вашем примере это не так, поэтому локальная переменная «walk_the_DOM» привязана к этой функции.
Главное преимущество заключается в том, что созданная таким образом функция будет продолжать работать (при условии, что копия ссылки на нее сохраняется где-то), даже если «walk_the_DOM» каким-то образом изменит ее значение. Зачем? Поскольку имя «walk» связано внутри функции и будет оставаться связанной независимо от того, что происходит с «walk_the_DOM».
Таким образом, есть две части этого заявления:
var walk_the_DOM = function walk(node, func) {
func(node);
node = node.firstChild;
while (node) {
walk(node, func);
node = node.nextSibling;
}
};
Первая часть
var walkt_the_DOM ...
Это обычная var
декларация, и это создает переменную, которая на самом деле не было особенным. Его значение подрывается выражением инициализации:
... = function walk(node, func) {
func(node);
node = node.firstChild;
while (node) {
walk(node, func);
node = node.nextSibling;
}
};
, который является функцией создания экземпляра функции.
Что произойдет, если функция была объявлена без имя? Как это:
var walk_the_DOM = function(node, func) {
func(node);
node = node.firstChild;
while (node) {
walk_the_DOM(node, func); // NOTE CHANGE HERE
node = node.nextSibling;
}
};
Это будет работать, если не по какой-то причине «walk_the_DOM» изменения:
var thatFunction = walk_the_DOM;
walk_the_DOM = "hello world";
thatFunction(whatever, someFunc); // WILL NOT WORK
Мы сохранили ссылку на эту функцию, а потому, что функция в этой версии ожидает, что способный «найти себя» через внешнюю (к функции) переменную «walk_the_DOM», он терпит неудачу, потому что «walk_the_DOM» больше не относится к функции. Это преимущество предоставления функции своему собственному имени.
Here is a classic article on the topic. Обратите внимание, что в этой статье указаны некоторые ошибки реализации, но это несколько устаревшее, и я думаю, что современные браузеры лучше.
FYI, 'node.firstChild()' не должен иметь '()' в конце. –
Возможный дубликат [Рекурсия | Два имени функции] (http://stackoverflow.com/questions/12357582/recursion-two-function-names) –