Этот метод выполняет код(или функцию), указанный в первом аргументе, асинхронно, с задержкой в delay миллисекунд.
В отличие от метода setInterval, setTimeout выполняет код только один раз.
В каком виде указывать первый параметр - в виде строки кода или функции - разницы нет.
Следующие два вызова работают одинаково:
// первый аргумент - строка
setTimeout('alert("прошла секунда")', 1000)
// первый аргумент - функция
function second_passed() {
alert("прошла секунда")
}
setTimeout(second_passed, 1000)
При указании строки кода - интерпретатор динамически создает анонимную функцию с телом из данной строки. Но более правильным считается объявление функции в явном виде, например так:
setTimeout(function() { alert('0.5 секунды') }, 500)
Вызов со строкой существует для совместимости с прежними версиями javascript.
Контекст выполнения, this
Функция выполняется в другом контексте, отличном от контекста, в котором задается setTimeout.
При этом значение this = window, поэтому о передаче правильного this надо позаботиться отдельно.
Пример: Без передачи this
object = {
func: function() { alert(this) }
}
setTimeout( object.func , 1000) // this будет равно window
Пример: Передача this через call
object = {
func: function() { alert(this) }
}
// правильный вариант с передачей this
setTimeout( function() { object.func.call(object) } , 1000)
Как правило, this также передаетя через замыкание, для этого используется либо промежуточная переменная во внешней функции, которая заранее ставится в нужное значение.
...
var self = this // промежуточная перменная
function fun() {
alert(self)
}
setTimeout(fun, 1000)
Отмена выполнения
Вы можете отменить выполнение setTimeout при помощи clearTimeout, используя для этого идентификатор таймаута.
var timeout_id = setTimeout(...)
clearTimeout(timeout_id)
Пример: Рабочий пример
<input type="button" onclick="on()" value="Запустить таймаут"/>
<input type="button" onclick="off()" value="Остановить отсчет"/>
<script>
function go() { alert('Я сработало') }
function on() {
timeoutId = setTimeout(go, 3000)
}
function off() {
clearTimeout(timeoutId)
}
</script>
Единственное место, где нашел корректную передачу контекста в setTimeout!
Существует ли аналогичный способ передачи контекста в анонимно определенную функцию: function(){... /*this - window*/ ...}
Илья, Спасибо!!!
Евгений.
Для передачи контекста используются либо call/apply, либо промежуточная переменная в самой функции, которая заранее ставится в нужное значение.
... var self = this // промежуточная перменная function fun() { alert(self) } setTimeout(fun, 1000)За clearTimeout() отдельное спасибо!
А как передать объект?
setTimeout('myFunc(объект)',1);
???
Если что-то нужно делать до определенных пор, тогда прописываем все в одной функции и не паримся...Выполнение итераций происходит последовательно с промежутком времени 60 микросекунд. + реализована передача параметра от функции её преемнице...
function set_active(cat) { setTimeout(function(){ //Делаем что-нибудь... Изменяем какую-либо величину if(/* Если величина подходит */) setTimeout(function(){set_active(cat);},10); },60); }Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.