Почему setTimeout ("otherFunction ()", 2000) не так? - PullRequest
1 голос
/ 31 января 2012

Я новичок в java-скрипте и в настоящее время читаю методы javascript Джона Резига Pro.Объясняя закрытие, он ссылается на вызовы типа setTimeout("otherFunction()",2000) как на случаи, когда у новых разработчиков JS возникают проблемы.Я не мог понять, почему это проблема?Может кто-нибудь объяснить, пожалуйста? В этом http://www.w3schools.com/js/js_timing.asp я вижу вызов как var t=setTimeout("alertMsg()",3000);, который похож на меня.

Ответы [ 5 ]

6 голосов
/ 31 января 2012

Это не"неправильно", просто это не обязательно "правильно", и это, безусловно, не рекомендуется.

Первый параметр setTimeout() функции может быть строкой или ссылкой на функцию / выражением функции.

Если вы передадите строку, она будет медленнее, потому что фактически вы делаете eval(), что не рекомендуется . Однако более важным, чем скорость, является то, что область, в которой выполняется код в строке, может не соответствовать ожидаемой (и может не совпадать в разных браузерах).

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

«Правильный» синтаксис для вашего примера:

setTimeout(otherFunction, 2000);

Обратите внимание, что после otherFunction круглых скобок нет - в противном случае он немедленно вызвал бы otherFunction() и передал бы возвращаемое значение из этой функции в setTimeout().

Если вам нужно передать параметры в вашу функцию, вы можете обернуть ее в анонимную функцию:

setTimeout(function() {
    otherFunction(param1, param2);
}, 2000);

Это может показаться неуклюжим по сравнению с setTimeout("otherFunction(param1,param2)", 2000), но, опять же, оно позволяет избежать проблем с областью, где определены otherFunction, param1 и param2.

5 голосов
/ 31 января 2012

Рекомендуется использовать следующее:

setTimeout(otherFunction, 2000);

или замыкание:

setTimeout(function() {
    otherFunction();
}, 2000);

Не используйте перегрузку, которая принимает строку в качестве первого параметра, поскольку интерпретатор javascriptнужно будет проанализировать эту строку в код JavaScript.

И да, сайт, на который вы ссылаетесь http://www.w3schools.com, вероятно, является одним из худших сайтов для изучения программирования.Это показывает, что именно вы не должны делать.

1 голос
/ 31 января 2012

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

Анализ строки не требуется, даже если он работает.

Если мы просто используем

setTimeout(alertMsg,3000);

переводчик не обязан выполнять какую-либо дополнительную (ненужную) работу, в результате чего код лучше .

1 голос
/ 31 января 2012

Потому что он должен eval otherFunction() (и, следовательно, порождать новый экземпляр интерпретатора) каждый раз. Если вы предоставите ссылку на функцию, setTimeout сможет выполнить ее без необходимости создавать новый интерпретатор.

Так что используйте:

setTimeout(otherFunction,2000);
0 голосов
/ 31 января 2012

Вместо setTimeout("otherFunction()",2000) лучше передать функцию напрямую, выполнив setTimeout(otherFunction,2000).Предыдущий способ должен сделать eval строку "otherFunction()".

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