我想在每n秒后打印一个数字,并根据几个条件我正在更改计时器以及我停止打印功能。我这样做了 -
var myfunc = {
value : 1,
running : false,
timer : 1000,
start : function(){
this.running = true;
clearInterval(this.timeout);
this.timeout = setTimeout(function() {
myfunc.execute(myfunc);
}, myfunc.timer);
},
execute : function(){
if(!this.running) return false;
console.log( 'Currently at -- ' + (this.value++) );
if (this.value > 5 ){
this.changetiming();
}
if (this.value > 10 ){
this.stop();
return;
}else{
this.start();
}
},
changetiming : function(){
this.timer = 3000;
},
stop : function(){
this.running = false;
clearTimeout(this.timeout);
}
};
myfunc.start();
现在我想知道以下代码有什么问题 -
for(var i = 0; i <= 10; i++){
print(i);
}
function print(i){
setTimeout(function(){
console.log(i)
},2000);
}
答案 0 :(得分:3)
我很确定这个问题“为什么这个JavaScript代码
for (var i = 0; i <= 10; i++){
print(i);
}
function print(i) {
setTimeout(function(){
console.log(i)
},2000);
}
在经过2秒后,立即打印出1到10的值?“之前已被问过。”
这是一个常见的错误。
您正在做的是致电print
10次。每次打印调用只需几微秒。为什么?因为它只是调用setTimeout
。执行setTimeout
只需几微秒即可完成。所有的电话都是日程安排将来会发生的事情。因此,在几微秒内,您将在未来约2秒内安排10件事情。所有的计划大约在同一时间发生。因此,所有控制台日志几乎同时发生,在您安排它们两秒后。
请参阅Satapal对您的问题的评论,以便做出您想做的事情。
答案 1 :(得分:3)
这是在ES6中执行此操作的正确方法和简便方法:
const printNumbersForEvery2Sec = (n)=>{
for (let i = 1; i <= n; i++) {
setTimeout( () =>{
console.log(i)
}, i * 2000)
}
}
printNumbersForEvery2Sec(10);
通过乘以i
,每个setTimeout()分别延迟2到20秒(2000 x 1,2000 x 2 ...)。
答案 2 :(得分:0)
您可能想尝试一下:
const printNumbersForEvery2Sec = (n)=>{
for (let i = 1; i <= n; i++) setTimeout(console.log, i * 1000,i)
}
printNumbersForEvery2Sec(10);```
答案 3 :(得分:0)
您可以使用javascript超时
function timer(n) {
for (let i = 0; i < 10; i++) {
setTimeout(function () {
console.log(i);
}, i * n);
}
}
timer(2000);
在上面的代码中,没有对时间进行编码,因此您可以决定所需的时间间隔。
答案 4 :(得分:0)
更通用的解决方案:
function printNumbers(start, end, delay=1){
const interval = delay*1000
for(let i=start; i<=end; i++){
setTimeout(console.log, (i-start)*interval, i)
}
}
printNumbers(3, 10, 2) // firstNumber, lastNumber, timeInSeconds
答案 5 :(得分:0)
#easiestway
for (var i = 0; i <= 10; i++){
print(i);
}
function print(i) {
setTimeout(function(){
console.log(i)
},i*2000);
}
答案 6 :(得分:0)
使用 IIFE、Clouser 和全局范围
(function(numbers){
for(var i=0; i<numbers.length; i++){
(function(i){
setTimeout(console.log, i*2000, i+1)
})(i);
}
})(new Array(10))
OR IIFE 和本地范围
(function(numbers){
for(let i=0; i<numbers.length; i++){
setTimeout(console.log, i*2000, i+1)
}
})(new Array(10))