Какой из этих форматов setTimeout лучше? - PullRequest
4 голосов
/ 23 октября 2009

Какая из этих конструкций лучше и почему

setTimeout(function() { $('#secret').hide(); }, 5000); 

setTimeout( "$('#secret').hide();", 5000);

$('#secret').show(5000, function(){ this.hide(xxx)} );

Ответы [ 5 ]

4 голосов
/ 23 октября 2009

Первый наверняка, он использует анонимную функцию для захвата функции, выполняемой после тайм-аута.

Второй использует eval() для оценки вашей строки, которая, вероятно, будет медленнее, чем первый вариант (не берите в голову аргументы, почему использование eval() плохо).

Третий элемент показывает элемент в течение 5 секунд, а затем скрывается сразу после его завершения, поэтому отличается от первого.

UPDATE:

Обновление

nickf побудило меня просмотреть источник, и номер 3 будет выполнен немедленно, если элемент уже виден. Вот соответствующие строки исходного кода

if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) 
    return opt.complete.call(this);
2 голосов
/ 23 октября 2009

Между вариантами один и два вариант один лучше, так как ему не нужно оценивать строку, чтобы преобразовать ее в исполняемый код.

Вариант три не делает то же самое. Он может иметь тот же результат, но только из-за клуджа: использование какой-либо другой функции, которая занимает много времени, прежде чем вызывать ту, которую вы хотите. Это очень неэффективно и не показывает, что именно вы пытаетесь сделать.

Перейти с вариантом 1.

edit : На самом деле, я только что проверил ваш третий вариант и могу сказать, что если элемент видим, то обратный вызов происходит немедленно, независимо от времени ожидания, которое вы передаете функции show() .

0 голосов
/ 23 октября 2009

Первый пример и третий функционируют по-разному, первые 5 секунд скрывают «# secret», а третий работает медленно в течение 5 секунд. все зависит от того, что вы хотите сделать.

0 голосов
/ 23 октября 2009

С первым вы теряете способность объединять эту функцию с другими. Вторая строка - это оцененная строка, поэтому вы должны быть осторожны с контекстом, и в любом случае это не очень хорошо для производительности. Последнее лучше, потому что после этого вы можете вызывать другие методы jquery, а jquery также имеет лучшее управление временем.

0 голосов
/ 23 октября 2009

Поскольку вы используете jQuery, я думаю, вы должны использовать третий.
Без jQuery первое лучше второго, потому что во втором случае движок JS должен вычислять выражение, а в первом - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...