2010-12-22 2 views
14

Какой из этих двух способов быстрее и почему?setTimeout() со строкой или (анонимной) ссылкой на функцию? speedwise

window.setTimeout("func()", 100); 

Или

window.setTimeout(function(){func();}, 100); 

Я предполагаю, что второй путь быстрее, если ни по какой другой причине, кроме Резига и все Ниндзя использовать его, я предполагаю, потому что он уже разобран в противоположности к первому пути, который он должен был бы создать новый синтаксический разбор «thingie». Я смутно помню, что это одна из причин, по которым людям не нравится eval().

Также, если у вас есть здесь, во втором скрипелле кода, первая полуколония считается хорошей практикой в ​​таком случае?

ответ

22

Там в третьей быстрее/проще вариант:

window.setTimeout(func, 100); 

... строго относящийся к вашему вопросу, то второе быстрее, так как это все-таки ссылка - не оценка, которая всегда довольно дорого. Что касается точки с запятой, да, это хорошая практика, чтобы всегда использовать их. Они никогда не должны были быть факультативными IMO, но многие со мной не согласятся ... но вы не можете возражать против того, чтобы быть явным в вашем коде, это всегда good вещь.

+0

Третий вариант - только когда нет аргументов – qwertymk

+0

@qwertymk - это правильно, но в ваших примерах нет (и * большинства * времени, когда вы видите это в диких, там тоже нет). –

+0

Я не знаю никого, кто не согласен с вами о вводе точки с запятой. – dheerosaur

0

Я не думаю, что в современных браузерах каждый из них заметно быстрее. Даже если бы кто-то был несколько быстрее, тот факт, что ваш код не будет вызывать setTimeout слишком часто, делает спорным.

Первый из них имеет преимущество быть более читаемым и будет моим предпочтением.

+1

Строка может быть немного более читаемой, но она * намного более опасна. –

+0

Ну ... если вы собираетесь заставить свой пользовательский интерфейс работать по подсказке(), чтобы пользователь вызывал функцию или делал HTTP-запрос для имени функции, тогда да, это небезопасно. – martona

+0

@Greg, это совсем небезопасно ... –

2

Люди, о которых вы упомянули, используют его, вероятно, не потому, что это быстрее.

  • код в альтернативном синтаксисе, является строка кода, который вы хотите выполнить после задержки миллисекунд. (Используя этот синтаксис не рекомендуется по тем же причинам, как с помощью Eval())

От https://developer.mozilla.org/en/DOM/window.setTimeout

7

Как вы написали это, оба одинаково «безопасны». Проблема безопасности появляется при попытке передать аргументы, потому что есть соблазн сделать что-то вроде этого:

setTimeout('func('+arg+')', 100); 

который имеет потенциал для внедрения кода. Кто-то будет использовать его, чтобы уничтожить вашу звезду смерти. Рано или поздно молодой джедай выяснит, как обмануть ваше приложение, сделав arg равным 3.14); deathStar.selfDestruct(, а следующее, что вы знаете, вы получаете звонок от императора, чтобы объяснить вашу ошибку.

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

Так что форма строки считается плохой практикой. Он медленнее и потенциально менее безопасен.

+0

Лучше сделать: setTimeout ("func", 100, arg); – Florent

4

Использование 'setTimeout' со строковым синтаксисом внутренне делает механизм javascript 'eval' it. Всякий раз, когда браузер встречает «eval» в любом месте кода, он не может выполнять многие оптимизации (и, следовательно, отключает их), только потому, что все может попасть в eval.

Оптимизация, такая как переменные кеширования, не может быть выполнена с помощью «eval», существующей в коде, поскольку «eval» может вводить новые переменные, которые будут игнорироваться на этапе компиляции Javascript (где он обнаруживает все объявления).

Второй синтаксис выполняется быстрее, потому что он просто вызовет функцию после задержки, и вы не попадете в пороки «eval».

Смежные вопросы