2016-03-01 79 views
1

後顯示數組項我的代碼段:的JavaScript:3秒一個時間

var i = 0; 

(function loop() { 
    text_objects[i].displayText(); 
    if (++i < text_objects.length) { 
     setTimeout(loop, 3000); 
    } 
})(); 

這是應該在一個時間顯示一個陣列的一箇中的內容,3秒分開。但是,當我運行該程序時,我只能得到第一個項目,並且它只是在那裏凍結,而不更新並顯示數組中的其餘項目。

我在做什麼錯?

+0

瀏覽器控制檯中的任何錯誤? – gurvinder372

+0

我在控制檯中用一個數組和'console.log()替換了'text_objects'和'displayText()',並且它工作正常。 – Himanshu

+0

控制檯日誌中實際上沒有任何內容。我不確定它爲什麼不起作用。 – TRX

回答

0

這工作正常。不知道這是你期望的嗎?

var i = 0; 

Array.prototype.displayText = function(i) { 
    console.log(this[i]); 
}; 

var text_objects = ['1', '2', '3']; 

(function loop() { 
    text_objects.displayText(i); 
    if (++i < text_objects.length) { 
     setTimeout(loop, 3000); 
    } 
})(); 
1

正如@nnnnnn正確地提到的,

環()是一個命名的函數表達式,和基準循環應該功能

此外代碼作品內在範圍精細。

var i = 0; 
 

 
var test = function(value){ 
 
    this.text = value; 
 
} 
 

 
test.prototype.displayText = function(){ 
 
    document.write(this.text + "<br/>"); 
 
} 
 

 
var text_objects = []; 
 

 
for (var j = 0; j<10; j++){ text_objects.push(new test(j)); } 
 

 
(function loop() { 
 
    text_objects[i].displayText(); 
 
    if (++i < text_objects.length) { 
 
     setTimeout(loop, 3000); 
 
    } 
 
})();

另一種方法:

var i = 0; 
 

 
function loop() { 
 
    document.write(i + "<br/>") 
 
    if (++i < 5) { 
 
     setTimeout(loop, 3000); 
 
    } 
 
} 
 

 
loop();

+1

loop()是一個命名的函數表達式,並且引用'loop'應該在函數的範圍內 - 這是正常和正確的Javascript行爲。但是如果你要重寫它,你能不能讓你的版本和OP的代碼做同樣的事情? – nnnnnn

+0

我的歉意。你是對的。 – Rajesh

+0

@nnnnnn,已經更新了我的答案。感謝您指出。 – Rajesh

0

以下是我的方法來回答。希望我幫助!

var i = 0; 

function loop() { 
    text_objects[i].displayText(); 
    i = i + 1; 
    if (i < text_objects.length) { 
    setTimeout(loop, 3000); 
    }; 
}; 
setTimout(loop, 3000);