setTimeout () со ссылкой на строку или (анонимную) функцию?По скорости - PullRequest
16 голосов
/ 22 декабря 2010

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

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

Или

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

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

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

Ответы [ 5 ]

25 голосов
/ 22 декабря 2010

Существует третий более быстрый / простой вариант:

window.setTimeout(func, 100);

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

8 голосов
/ 15 декабря 2012

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

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

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

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

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

4 голосов
/ 29 июля 2015

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

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

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

2 голосов
/ 22 декабря 2010

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

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

С https://developer.mozilla.org/en/DOM/window.setTimeout

0 голосов
/ 22 декабря 2010

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

Преимущество первого состоит в том, что он более читабелен, и это было бы моим предпочтением.

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