在SetTimeout之后获取返回值

时间:2011-03-06 14:39:53

标签: javascript function eval return settimeout

我刚刚询问过按名称调用函数,现在我想在return之后处理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); 它提醒功能的返回值。我该如何储存?

2 个答案:

答案 0 :(得分:5)

您不需要使用任何此字符串操作。只需将函数引用传递给window.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);
}

答案 1 :(得分: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);
}