Оператор this может упростить вашу жизнь:
var Y = function(f) {
return (function(g) {
return g(g);
})(function(h) {
return function() {
return f.apply(h(h), arguments);
};
});
};
Тогда вы избегаете дополнительной функции:
var fac = Y(function(n) {
return n == 0 ? 1 : n * this(n - 1);
});
Наконец, вы вызываете fac(5)
.
Попытка
setTimeout(function() { return true; }, 10000);
Первый аргумент ожидает функцию. Это по памяти; Я не проверял это.
Редактировать: Что сказал Гамбо ... поздно здесь ... не уверен, о чем я думал.
Задержка не произойдет до тех пор, пока JavaScript не вернет управление браузеру, поэтому ваша строка 4 будет выполняться до начала setTimeout.
Вы должны делать все, чтобы все происходило на основе событий.
setTimeout запускает отдельный поток выполнения в интерпретаторе JavaScript. Вам нужно передать ему функцию и спроектировать свои сценарии таким образом, чтобы функция, выполняемая setTimeout, продолжалась с того места, где была остановлена вызывающая функция, тем самым имитируя сон.
Могу я предложить это как общее решение:
function sleep (ms, args, obj) {
/* Called at the top of a function to invoke a delay in processing that
function
Returns true if the function should be executed, and false if the sleep
timer is activated.
At the end of the sleep tiemout, the calling function is re-called by
calling it with "apply (obj, args || [])".
*/
var caller = sleep.caller;
if (caller.sleepTimer) {
/* if invoked from timeout function, delete timer and return false */
delete caller.sleepTimer;
return true;
}
/* Create timer and re-call caller at expiry */
caller.sleepTimer = window.setTimeout (function () {
caller.apply (obj || null, args || []);
},ms);
return false;
}
Примеры использования:
function delayed () {
if (!sleep (5000)) return;
document.body.innerHTML += "<p>delayed processing</p>";
}
function delayed_args (a, b) {
if (!sleep (10000, arguments)) return;
document.body.innerHTML += "<p>args : (" + a + ", " + b + ")</p>";
}
function delayed_method_args (a,b) {
if (!sleep (20000, arguments, this)) return;
document.body.innerHTML += "<p>method_args " + this + " (" + a + ", " + b + ")</p>";
}
Протестировано в Opera и Firefox 3.0
1 var chkResult = Validation();
2 alert("wait ten seconds, then press ok");
3
4 document.getElementById('abc').innerHTML = chkResult;
Предыдущий код делегирует задачу ожидания параллельному процессору. Это немного запутано, потому что для этого стиля потоковой передачи вам придется использовать DSL.
Javascript должен разделять поток с браузером, поэтому пауза Вы хотите, чтобы браузер выглядел так, как если бы это было возможно, на 10 секунд. Это делают такие функции, как «предупреждение» и «подсказка». Для этого они являются злом, поскольку одно предупреждение в цикле может поставить весь браузер на колени, и единственный выход - принудительно закрыть его.
Способом решения этой проблемы является парадигма, основанная на событиях. Javascript имеет функции первого класса, поэтому их можно передавать как значения для «обратных вызовов», которые вы можете назначать определенным событиям.
setTimeout - одно из таких событий. Другие разместили код, но в целом вы захотите просто назначить свои функции определенным событиям, а затем уйти с дороги браузера, чтобы он мог заниматься своими браузерами. Браузер сообщит вам, когда что-то произошло, и вы сможете быстро сделать что-то подходящее, а затем снова уйти с дороги. Таким образом, браузер может сохранять видимость отзывчивости.
, если вы хотите узнать больше, взгляните на этот вопрос: Чем отличается графический интерфейс и поток игровых программ с веб-программами
but this way, your line line will execute BEFORE line 4