【问题标题】:What should be the correct signature of the given method给定方法的正确签名应该是什么
【发布时间】:2013-08-08 08:06:54
【问题描述】:

这是我的功能

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

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

我试过下面的代码

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

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

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

【问题讨论】:

  • 是在作用域中定义的strType。你能发布整个相关代码吗?即定义的地方
  • strtype 是另一个变量值,它被传递到它可能是启动或停止的代码中,为什么你需要它的值? @SomeshMukherjee

标签: javascript html javascript-events


【解决方案1】:

您的 sn-ps 都不正确,因为 setTimeout 期望函数引用作为第一个参数,而不是字符串。您可以传递一个字符串,但只需检查 MDN says about that 的内容:

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

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

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

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

无论如何,上面的代码应该可以解决您的问题,但请注意,如果 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 周围的引号,在超时结束时,字符串的行为就像传递给evaleval("(UpdateKnl('" + strType + "', abc))"),这确实是邪恶abc 可能在延迟结束时已被重新分配...所以我必须敦促您重构此代码

【讨论】:

  • 这是不准确的。 setTimeout() 将接受一个字符串,然后进行评估,尽管现在这不是很好的做法,在这种情况下绝对不合适。
  • 我正在修改旧代码,它工作正常,所以我不认为代码可能是错误的。
  • @millimoose:是的,可以传递一个字符串,就像可以使用 eval 解析 JSON 字符串一样......你也让那个幻灯片吗?
  • @user2644549:不需要引号。如果strType 是一个包含字符串的变量,则该 variable 被引用,而不是它的值。没有需要添加引号,就像您在代码中的其他任何地方使用变量时不需要引号一样......
  • @EliasVanOotegem 我要说的是,在您的原始版本中,语句“setTimeout 期望函数引用作为第一个参数,而不是字符串”,特别是隐含的声明“setTimeout() 确实not 接受字符串”完全是错误的。我什至在我的评论中说,使用字符串是一种不好的做法,那么你到底在争论什么?
猜你喜欢
  • 2020-12-16
  • 2014-04-13
  • 1970-01-01
  • 2011-05-01
  • 2010-11-10
  • 2011-01-06
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
相关资源
最近更新 更多