这是我的功能
FrmLoadingTimerID = setTimeout("UpdateKnl('"+ strType +"')",500);
其中strytype
的值是一个字符串。因此,在UpdateKnl方法中,switch语句应该遵循strtype并以''结束。我想发送另一个参数和函数,但没有得到正确的方法。
我试过以下代码
FrmLoadingTimerID = setTimeout("UpdateKnl('"+ strType +"',abc)",500);
和
FrmLoadingTimerID = setTimeout("UpdateKnl('"+ strType +"',+"abc")",500);
如果我尝试将abc的值赋给其他变量,则两种方式都不传递值,因为未定义的错误是throw。
答案 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
周围的引号,在超时结束时,字符串的行为就好像传递给eval
:eval("(UpdateKnl('" + strType + "', abc))")
,这确实是 evil < / em>的。延迟结束时abc
可能已被重新分配...所以我必须敦促你重构这段代码