Как передать параметры функции 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.

http://jsfiddle.net/85fmwew4/

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 );