0

这是我的功能

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

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

我试过下面的代码

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

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

在这两种方式中,如果我尝试将 abc 的值分配给其他变量,则不会将值传递为未定义的错误。

4

1 回答 1

2

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

替代语法中的代码是您要在延迟毫秒后执行的代码字符串(不推荐使用此语法,原因与使用 eval() 相同)

众所周知,evalis evil并且只有很少的有效用例。在这种情况下,有一种更好的方式来开展您的业务,因此答案是:

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

您可能需要注意 JS 中关于变量名的一些约定:变量以小写字母开头,并且是cammelCased,函数也以 lowerCaseAndAreCammelCased 开头,除非函数是构造函数,在在这种情况下,它以大写字符开头。

无论如何,上面的代码应该可以解决您的问题,但是请注意,如果 2 个变量中的任何一个在超时调用其回调函数之前的 500 毫秒内更改了值,则将使用更改后的值。为避免这种情况,请使用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,字符串的行为就好像它被传递给了eval: eval("(UpdateKnl('" + strType + "', abc))"),这确实是邪恶的。abc延迟结束时可能已重新分配...所以我必须敦促您重构此代码

于 2013-08-08T08:09:28.393 回答