Подтвердить что ты не робот

Arguments.callee устарел - что следует использовать вместо этого?

Для выполнения таких действий, как

setTimeout(function () {
    ...
    setTimeout(arguments.callee, 100);
}, 100);

Мне нужно что-то вроде arguments.callee. Я нашел информацию на javascript.info, что arguments.callee устарел:

Это свойство устарело по ECMA-262 в пользу именованной функции выражения и для лучшей производительности.

Но что следует использовать вместо этого? Что-то вроде этого?

setTimeout(function myhandler() {
    ...
    setTimeout(myhandler, 100);
}, 100);
// has a big advantage that myhandler cannot be seen here!!! 
// so it doesn't spoil namespace

BTW, совместим с кросс-браузером arguments.callee?

4b9b3361

Ответ 1

Да, это то, что теоретически следует использовать. Ты прав. Тем не менее, он не работает в некоторых версиях Internet Explorer, как всегда. Так что будь осторожен. Возможно, вам придется вернуться на arguments.callee или, скорее, просто:

function callback() {
    // ...
    setTimeout(callback, 100);
}

setTimeout(callback, 100);

Что работает в IE.

Ответ 2

Но что следует использовать вместо этого? Что-то вроде этого?

Да, вы ответили на свой вопрос. Для получения дополнительной информации см. Здесь:

Почему свойство arguments.callee.caller устарело в JavaScript?

В нем довольно хорошо обсуждается, почему это изменение было сделано.

Ответ 3

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 в описании:

Предупреждение. Пятое издание 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.