您的所有片段都不正确,因为setTimeout
期望函数引用作为第一个参数,而不是字符串。您可以传递一个字符串,但只需检查MDN 对此的说明:
替代语法中的代码是您要在延迟毫秒后执行的代码字符串(不推荐使用此语法,原因与使用 eval() 相同)
众所周知,eval
is 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
延迟结束时可能已重新分配...所以我必须敦促您重构此代码