2014-01-25 4 views
0

Я прочитал следующий вид функции в JavaScript: The Good Parts книге. Это что-то вроде этого.JavaScript присваивает именованную функцию переменной

var Foo = function NameOfFunction() { 

}; 

Я вообще не понимаю эту функцию. Было бы здорово, если бы кто-нибудь мог объяснить это вообще и как это можно использовать?

Точный код из книги ниже, который в основном используется для рекурсии

var walk_the_DOM = function walk(node, func) { 
    func(node); 
    node = node.firstChild(); 
    while (node) { 
     walk(node, func); 
     node = node.nextSibling; 
    } 
}; 
+1

FYI, 'node.firstChild()' не должен иметь '()' в конце. –

+0

Возможный дубликат [Рекурсия | Два имени функции] (http://stackoverflow.com/questions/12357582/recursion-two-function-names) –

ответ

5

При создании экземпляра функции с именем — имя после 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. Обратите внимание, что в этой статье указаны некоторые ошибки реализации, но это несколько устаревшее, и я думаю, что современные браузеры лучше.

+0

Спасибо @pointy. Не могли бы вы привести еще один простой пример кодирования для разработки вашего ответа? Спасибо – 2619

+0

@ 2619 ok ответ был расширен. – Pointy

Смежные вопросы