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
?
Ответы
Ответ 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.