什么应该是给定方法的正确签名

时间:2013-08-08 08:06:54

标签: javascript html javascript-events

这是我的功能

FrmLoadingTimerID = setTimeout("UpdateKnl('"+ strType +"')",500);

其中strytype的值是一个字符串。因此,在UpdateKnl方法中,switch语句应该遵循strtype并以''结束。我想发送另一个参数和函数,但没有得到正确的方法。

我试过以下代码

FrmLoadingTimerID = setTimeout("UpdateKnl('"+ strType +"',abc)",500);

FrmLoadingTimerID = setTimeout("UpdateKnl('"+ strType +"',+"abc")",500);

如果我尝试将abc的值赋给其他变量,则两种方式都不传递值,因为未定义的错误是throw。

1 个答案:

答案 0 :(得分:2)

您的所有代码段都不正确,因为setTimeout期望函数引用作为第一个参数,而不是字符串。您可以传递字符串,但只需检查MDN says about that

  备用语法中的

代码是您希望在延迟毫秒后执行的一串代码(建议不要使用此语法,原因与使用eval()相同)

众所周知,eval evil ,并且只有很少的有效用例。在这种情况下,有一个更好的方式来开展您的业务,所以这就是为什么答案是:

FrmLoadingTimerID = setTimeout(function()
{
    //read as UpdateKnl(someVar, 'aString', 123, ['an','array'],{some:'object'});
    return UpdateKnl(strType, abc);//pass 2 variables
},500);

你可能想要注意JS中变量名称的几个约定:Variables 以小写开头,并且 cammelCased ,函数也以lowerCaseAndAreCammelCased开头,除非该函数是构造函数,在这种情况下,它是以 UpperCase char开头的。

无论如何,上面的代码应该解决你的问题,但是请注意,如果在超时之前500ms中的任何2个变量更改值调用其回调函数,则将使用更改的值。要避免这种情况,请使用iife创建闭包:

FrmLoadingTimerID = setTimeout((function(strType, abc)
{// assignes passed arguments to these vars //
    return function()
    {
        return UpdateKnl(strType, abc);//uses arguments of IIFE
    };
}(strType, abc)),500);//pass current values of these variables here

阅读标签wiki,它解释了这种结构是如何工作的,以及为什么要使用它(它类似于臭名昭着的循环问题)。

如果由于某种原因,你想坚持并保持将字符串传递给setTimeout的疯狂:

setTimeout("UpdateKnl('" + strType + "', 'abc')",500);

这将字符串值strType和字符串常量'abc'传递给函数。如果abc是变量,则应在超时延迟结束时引用该变量:

setTimeout("UpdateKnl('" + strType + "', abc)",500);

删除abc周围的引号,在超时结束时,字符串的行为就好像传递给evaleval("(UpdateKnl('" + strType + "', abc))"),这确实是 evil < / em>的。延迟结束时abc可能已被重新分配...所以我必须敦促你重构这段代码