2013-07-22 109 views
0

我有以下代码:如何参数传递给函数的setTimeout

function fn($){ 
    return function(){ 
    innerFn = function(){ 
     setTimeout(show, 1000); 
    }; 

    show = function(){ 
     $.alert("TEST"); 
    } 
    } 
} 

但是,在一秒钟后,该功能show在运行时,它说$是不确定的。我该如何解决这个问题?

+1

何时以及如何被'fn'叫什么名字? (如何调用'show'?) –

+0

加载页面,调用fn.like yui模块。 – MarioDu

+0

如果调用'fn'时定义'''','show'应该可用。 –

回答

2

如何参数传递给函数的setTimeout

的setTimeout有built in mechanism添加PARAMS

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);

使用它。

如果你打算使用this - 你应该小心。但这是另一个问题。

+0

请参阅代码,我的意思是使用$ – MarioDu

1

这里有很多东西在玩。最重要的是你的setTimeout永远不会被调用,因为innerFn永远不会被调用。这应该做的伎俩。

function fn($){ 
    return function(){ 
    setTimeout(function(){ 
     $.alert("TEST"); 
    }, 1000); 
    } 
} 

fn(window)(); //triggers your alert after 1000ms 
+0

我在别的地方叫innerFn,这只是一个例子。我想知道,像上面的代码一样,如何实现? – MarioDu

+0

在您当前的示例中,您的show函数可以访问$ variable,因为它位于“父”范围内。您的实际代码中必须有其他内容。 –

1

您的代码是没有任何意义的,因为什么被称为:

function fn($){ 
    return function(){ 
    innerFn = function(){ 
     setTimeout(show, 1000); 
    }; 

    show = function(){ 
     $.alert("TEST"); 
    } 
    } 
} 

比方说,我打电话fn传递window,则返回一个功能,我可以执行。但是因为这个函数只包含函数声明 - 你也忘记了var所以你污染了全局范围,那很糟糕 - 什么都不会发生。

你需要至少一个函数调用中,如:

function fn($){ 
    return function(){ 
    var innerFn = function(){ 
     setTimeout(show, 1000); 
    }; 

    var show = function(){ 
     $.alert("TEST"); 
    } 

    innerFn(); 
    } 
} 

fn(window)(); 

,这将作品。但是,这绝对是多余的。您可以只有:

function fn($){ 
    return function(){ 
    function show(){ 
     $.alert("TEST"); 
    } 

    setTimeout(show, 1000); 
    } 
} 

获得相同的结果。但是,如果您的目标仅限于setTimeout的参数,则可以使用bind。如文档所述,您可以使用第3个参数setTimeout,但似乎是not supported in IE for legacy reason

所以,用bind意志为转移的例子如下:

function show() { 
    this.alert('test'); 
} 

setTimeout(show.bind(window), 1000); 

还要注意window是默认的全局对象,所以平时你没有这样做,只是alert就够了。不过,我想这不是你的实际代码,而只是一个简单的测试,正如警报的字符串所示。

如果你喜欢有window作为第一个参数,而是和你不感兴趣的上下文对象this,你可以这样做:

function show($) { 
    $.alert('test'); 
} 

setTimeout(show.bind(null, window), 1000); 
相关问题