2011-04-11 69 views
1

我需要在一段時間後動態調用javascript函數,函數display_1,2,... n將動態構造。我的腳本看起來像這樣,但如果我使用下面的代碼,函數永遠不會被觸發,但是如果我硬編碼函數,它似乎很好。如何動態調用javascript函數

function display_1() { 
alert(1); 
} 

function display_2() { 
alert(2); 
} 

function display() { 
var prefix = 'display_'; 
for(var i = 1; i < 3; i++) { 
setTimeout(prefix.concat(i), 1000); 
} 

window.onload = display(); 

回答

2

必須添加括號,這樣的函數被調用:

setTimeout(prefix.concat(i)+"()", 1000); 

或者乾脆:

setTimeout(prefix + i + "()", 1000); 

除了那請注意,這兩種功能都在同一時間pratically叫,因爲計時器開始'setTimeout()`在同一時間開始

根據你想要做什麼,你可能會看看setInterval()或在display_1()函數結束時啓動第二個超時。

+0

+1還提到了'setTimeout'的異步特性。 – xtofl 2011-04-11 07:30:00

5

而是通過串去的,你不妨組的功能集成到一個數組:

function display_1() {...} 

function display_2() { ... } 

var functions = [ display_1, display_2 ]; 

function display() { 
    for(var i = 0; i != functions.length; ++i) { 
    setTimeout(functions[i], 1000); 
    } 
} 

如果你想走得更遠,你甚至可以離開了明確的功能名稱:

var functions = [ 
    function() { /*the function_1 implementation*/ 
    }, 
    function() { /*the function_2 implementation*/ 
    } 
]; 
+0

只是好奇:有沒有使用'i!= functions.length'而不是'i 2011-04-11 07:29:20

+1

也,我認爲有一個錯字:括號不應該在'setTimeout()'的第一個參數有,因爲你想傳遞函數*引用*而不是立即調用它。 – 2011-04-11 07:34:21

+0

@Udo G:謝謝。 – xtofl 2011-04-11 07:39:44

1

應該

function display_1() { 
alert(1); 
} 

function display_2() { 
alert(2); 
} 

function display() { 
var prefix = 'display_'; 
for(var i = 1; i < 3; i++) { 
setTimeout(prefix.concat(i)+'()', 1000); 
} 
} 

window.onload = display; 
  1. 傳遞給setTimeout的應該叫
  2. onload事件應被設置爲一個函數的函數的字符串,而不是它的返回值
0
setInterval('load_testimonial()',5000);//first parameter is your function or what ever the code u want to execute, and second is time in millisecond.. 

這將幫助您在每個給定時間執行您的功能。

0

如果你真的要執行的功能之間的1000毫秒的延遲,你可以做這樣的事情:

window.onload = function() { 
    var n = 0; 
    var functions = [ 
     function() { 
      alert(1); 
      setTimeout(functions[n++], 1000); 
     }, 
     function() { 
      alert(2); 
      setTimeout(functions[n++], 1000); 
     }, 
     function() { 
      alert(3); 
     } 
    ]; 
    setTimeout(functions[n++], 1000); 
}; 

(如果需要重寫它的重複少的性質)