Как передать параметры функции setTimeout
Я относительно новичок в JavaScript. Я написал простую программу счетчик, который начинает отсчет от 10 до 1.
<script type="text/javascript">
function countDown(secs) {
var element = document.getElementById("status");
element.innerHTML = "Please wait for "+secs+" seconds";
if(secs < 1) {
clearTimeout(timer);
element.innerHTML = '<h2>Countdown Complete!</h2>';
element.innerHTML += '<a href="#">Click here now</a>';
}
secs--;
---> **var timer = setTimeout('countDown('secs')',1000);**
}
</script>
<div id="status"></div>
<script type="text/javascript">countDown(10);</script>
затем я попытался передать параметр как '+secs+'
функции обратного отсчета.
var timer = setTimeout('countDown('+secs+')',1000);
выше изменений.
мой вопрос: почему мне нужно передавать параметр как " + secs+", а не только "secs"? Какая разница?
8 ответов
использовать
var timer = setTimeout(function(){
countDown(secs)
},1000);
или
var timer = setTimeout('countDown(' + secs + ')',1000);
в вашем случае проблема заключалась в том, что вы использовали конкатенацию строк с переменной без +
знак (мой второй пример) с вызовет синтаксическую ошибку
ваша первая попытка-ошибка synax:
var timer = setTimeout('countDown('secs')',1000);
вы пытаетесь передать строку setTimeout
(это плохая идея для начала), но вы не создаете строку должным образом.
одинарные кавычки вокруг слова secs
не экранируются, поэтому вы фактически передаете строковый литерал countDown(
с последующей переменной secs
, за которым следует строковый литерал )
.
Поскольку между строками нет операторов, это недопустимо синтаксис.
однако, когда вы используете +
символы, вы добавляете 3 строки вместе, чтобы создать вызов метода (the +
оператор используется для объединения строк в JavaScript):
'countDown(' + 'secs' + ')' === 'countDown(secs)'
три строки, добавленные вместе, создают строку, содержащую допустимый JavaScript, поэтому ее можно передать в setTimeout ()
простой способ сделать это с помощью setTimeout:
setTimeout(FunctionName,delay,arg1,arg2....);
в вашем случае вы можете просто сделать так:
setTimeout(countDown,1000,secs);
Я предлагаю эту ссылку:http://javascript.info/settimeout-setinterval
на setTimeout
функция позволяет передавать дополнительные параметры функции. Следовательно, вы можете переписать свой код следующим образом:
var timer = setTimeout(countDown, 1000, secs);
он поддерживается во всех основных браузерах, за исключением некоторых старых версиях IE. См. этот вопрос для получения более подробной информации:почему подчеркивания.js имеют функцию задержки?
просто напишите закрытие, чтобы выполнить декремент так:
if (secs < 1) {
element.innerHTML = '<h2>Countdown Complete!</h2>';
element.innerHTML += '<a href="#">Click here now</a>';
} else {
// wait 1 second
setTimeout(function() {
countDown(secs - 1); // decrement and run ourselves again
}, 1000);
}
Я также удалены clearTimeout()
в пользу простой else
состояние.
У АДИТ была правильная идея. Мне нужно было запустить несколько таймаутов в цикле, и все они закончились с переменной, установленной на одно и то же значение. Вот скрипка, иллюстрирующая, почему единственный метод, который хорошо работает асинхронно, - это Aadit.
for(i=0;i<10;i++){
setTimeout(function(){bad(i)}, 1000) // bad for async
setTimeout(good, 1000, i) // good for async
}
это единственное, что сработало для меня (передача переменных в setTimeout в node.в JS):
setTimeout(function(teamNum,zeroBase,position) {
spawnAI(roomIndex, 'scout', teamNum, position);
}, timeToSpawn,teamNum,zeroBase,position);
теперь с недавними оптимизациями javascript в современных браузерах вы можете просто сделать:
var timer = setTimeout( countDown( secs ) , 1000 );