Minitech ответ довольно хороший, но он пропускает еще один сценарий. Ваша функция объявления называется обратным вызовом, что означает две вещи: во-первых, функция является объектом в памяти, а во-вторых, имя функции предназначено только для ссылки на объект. Если вы по какой-либо причине нарушите связь между этими двумя, предложенный код также не будет работать.
Доказательство:
function callback() {
// ...
setTimeout(callback, 100);
}
setTimeout(callback, 100);
var callback2 = callback; //another reference to the same object
callback = null; //break the first reference
callback2(); //callback in setTimeout now is null.
С разработчик страницы Mozilla в описании:
Предупреждение: 5-е издание ECMAScript (ES5) запрещает использование
arguments.callee () в строгом режиме. Избегайте использования arguments.callee ()
либо давая функциональным выражениям имя, либо используйте функцию
объявление, где функция должна вызывать себя.
, очевидно, это первый пример обходного пути ", когда либо дается выражение функции для имени ", но давайте посмотрим, как мы можем иметь дело с ", или используем объявление функции, где функция должна вызывать себя"и что это принесет:
function callback(){
//...
setTimeout(innercall(), 100);
function innercall(){
//innercall is safe to use in callback context
innercall.caller(); //this will call callback();
}
}
Тогда мы можем делать все, что захотим, с помощью ссылки обратного вызова:
var callback2 = callback;
callback = null;
callback2(); //will work perfectly.