内部函数使用setTimeout调用父函数

时间:2012-08-01 15:29:42

标签: javascript jquery settimeout

内部函数如何在父函数到期后调用它?

setTimeout(main, 2000);
function main(){
    /* .... code */
    setTimeout(console.log("hello after 5 seconds"), 5000);
}

预期的操作是在5秒内打印hello after 5 seconds(共7个);使用上面的代码,它会在2秒内打印出来。

3 个答案:

答案 0 :(得分:3)

您需要传递setTimeout个函数引用。使用setTimeout(console.log("hello after 5 seconds"), 5000);,您可以立即致电console.log 。只要你在函数名后写(),就可以调用它。

console.log返回 undefined ,这是传递给setTimeout的内容。它只是忽略 undefined 值并且什么都不做。 (它不会引起任何错误。)

如果您需要将参数传递给回调函数,可以采用几种不同的方法。

匿名函数:

setTimeout(function() {
    console.log('...');
}, 5000);

返回一个函数:

function logger(msg) {
    return function() {
        console.log(msg);
    }
}

// now, whenever you need to do a setTimeout...
setTimeout(logger('...'), 5000);

这是有效的,因为调用logger只会返回一个关闭msg的新匿名函数。返回的函数是实际传递给setTimeout的函数,当触发回调时,它可以通过闭包访问msg

答案 1 :(得分:2)

我想我理解你想要的东西。看看:

var main = function(){
    console.log("foo");
    var function1 = function( string ) {
        console.log("function1: " + string);
    };
    var function2 = function() {
        console.log( "hadouken!" );
    };
    // you will need to use a closure to call the function
    // that you want with parameters
    // if you dont have parameters, just pass the function itself
    setTimeout(function(){ function1("bar") }, 5000);
    setTimeout(function2, 6000);
}
setTimeout(main, 2000);

或者:

function main(){
    console.log("foo");
    function function1( string ) {
        console.log("function1: " + string);
    };
    function function2() {
        console.log( "hadouken!" );
    };
    // you will need to use a closure to call the function
    // that you want with parameters
    // if you dont have parameters, just pass the function itself
    setTimeout(function(){ function1("bar") }, 5000);
    setTimeout(function2, 6000);
}
setTimeout(main, 2000);

我通常更喜欢第一个sintax。

jsFiddle:http://jsfiddle.net/davidbuzatto/65VsV/

答案 2 :(得分:1)

works!你错过了单词function

setTimeout(main, 1000);

function main() {
    function function1 () { alert(1); };
    setTimeout(function1, 1000);
}​