2011-03-06 30 views
5

我剛剛問了一下名字調用函數,現在我要處理return語句後SetTimeout獲取返回值之後的setTimeout

function ECall(funcName, arg) 
{ 
    command += "("; 
    for (var i=1; i<arguments.length; i++) 
    { 
     command += "'" + arguments[i] + "'"; 
     if (i != arguments.length-1) command += ','; 
    } 
    command += ")"; 

    //var funcPtr = eval(funcName); 
    //return funcPtr(arg); // This works, but I need SetTimeout 

    setTimeout('window[\'' + funcName + '\']' + command, 1000); 
} 

setTimeout的偉大工程,但我必須節省調用函數的返回值。當我寫:setTimeout('alert(window[\'' + funcName + '\']' + command + ')', 1000); 它提醒函數的返回值。我如何存儲它?

回答

5

你不需要使用任何此字符串操作。只需傳遞函數參考window.setTimeout()。將函數的返回值,只需將其分配給你寫的,這是不可能的setTimeout後得到的返回值,權傳遞給window.setTimeout()

var savedValue; 

function ECall(funcName) 
{ 
    var args = Array.prototype.slice.call(arguments, 1); 
    var func = window[funcName]; 

    window.setTimeout(function() { 
     savedValue = func.apply(this, args); 
    }, 1000); 
} 
2

如果你想從ECall返回一個值,它將不起作用。

setTimeout是異步的,這意味着ECall將返回被調用setTimeout代碼之前。

或者,如果您希望alert()成爲setTimeout的一部分,則可以傳遞匿名函數。另外,最好不要將字符串傳遞給setTimeout

我應該這樣做,而不是:

function ECall(funcName, arg) 
{ 
     // Get an Array of the arguments, except for the first one. 
    var args = Array.prototype.slice.call(arguments, 1); 

     // Pass an anonymous function that calls the global "funcName" function 
     // inside the alert(). 
     // It uses .apply() to pass the arguments we sliced. 
    setTimeout(function() { 
     alert(window[ funcName ].apply(window, args)); 
    }, 1000); 
} 
+1

功能的變量?有沒有辦法做到這一點? – Ockonal 2011-03-06 15:01:15

+0

@Ockonal:我在答案中使用了一個警告,但是@Tim Down在他的回答中顯示了相同的概念(http://stackoverflow.com/questions/5211103/get-return-value-after-settimeout/5211190# 5211190),但將結果存儲在預先定義的變量中(這是您似乎想要的)。該值直到'setTimeout'運行纔會可用。 – user113716 2011-03-06 15:03:16