2012-01-23 2 views
1

У меня есть две версии кода. Может ли кто-нибудь сообщить мне, что является оптимальным и быстрым?Функция Javascript, вызывающая внутри setTimeout - что лучше?

Версия 1:

function showMsg(a) 
{ 
    alert(a); 
} 
function invokeShowMsg() 
{ 
    var msg = 'hi'; 
    showMsg(msg); 
} 
window.setTimeout(invokeShowMsg,1000); 

Версия 2:

function showMsg(a) 
{ 
    alert(a); 
} 
window.setTimeout(function(){showMsg('hi');},1000); 

еще один сомнения, это путь Version 2 вызывные называется "Закрытие"?

+0

Каков твой выбор для "оптимального"? Я подозреваю, что # 1 быстрее, потому что он передает ссылку на уже объявленную функцию, а не оценивает выражение функции и передает ссылку на нее, но вы должны протестировать ее в разных браузерах. В любом случае, если исполнение задерживается минимум на 1 секунду, какой актуальностью является скорость? – RobG

+0

Поскольку я запускаю его в браузере для мобильных устройств, будет ли версия 2 вызывать какое-либо неблагоприятное воздействие? – thandasoru

+0

Вы не заметите этого, даже если попробуете. Большинство * JS-модулей компилируют код. – Blender

ответ

4

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

Я предпочитаю # 2, так как она чиста и сохраняет синтаксис читаемый:

setTimeout(function() { 
    showMsg('hi'); 
}, 1000); 
+0

[Это действительно закрытие] (http://stackoverflow.com/questions/111102/how-do-javascript-closures-work)? – voithos

+0

Я просто говорю «да», потому что это не имеет никакого значения для меня, поскольку я действительно не нашел практического использования для выделения анонимной функции и закрытия (даже если я использую оба). – Blender

+2

Но +1 для фактического знания ответа. Я отвергаю свое заявление в позоре. – Blender

3

Да, версия 2 называется Closure. Что касается скорости, они оба эквивалентны.

+0

Спасибо, я читал где-то на страницах Google, где он сказал, что версия 2 (закрытие) медленнее, чем версия 1. Я использовал версию 2 по всему моему коду, и я не хочу сейчас ее менять .. – thandasoru

2

Как @Blender сказал, я также предпочитаю , так как он не загрязняет глобальное пространство (полуполезные) функции «вызывающего». Это чисто, и это просто понять кому-то, кто знает, как работает setTimeout. И насколько скорость идет, практически нет разницы. Here's a performance comparison of the two methods.

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

+0

спасибо за ссылку. Отличное описание при условии :-) – thandasoru

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