Arguments.callee устарела - что следует использовать вместо этого? - PullRequest
37 голосов
/ 02 декабря 2011

Для таких вещей, как

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

Кстати, совместим ли arguments.callee кросс-браузерный

Ответы [ 3 ]

10 голосов
/ 03 декабря 2011

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

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

setTimeout(callback, 100);

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

5 голосов
/ 02 декабря 2011

Но что тогда использовать вместо этого? Как-то так?

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

Почему свойство arguments.callee.caller не поддерживается в JavaScript?

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

1 голос
/ 10 июля 2015

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...