SetTimeout() со строкой или (анонимной) ссылкой на функцию? По скорости

Какой из этих двух способов быстрее и почему?

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

или

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

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

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

Ответы

Ответ 1

Есть третий более быстрый/простой вариант:

window.setTimeout(func, 100);

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Из https://developer.mozilla.org/en/DOM/window.setTimeout

Ответ 5

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

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