这些setTimeout格式哪个更好?

4
哪种构造更好,为什么?
setTimeout(function() { $('#secret').hide(); }, 5000); 

setTimeout( "$('#secret').hide();", 5000);

$('#secret').show(5000, function(){ this.hide(xxx)} );
5个回答

4
第一个肯定是使用匿名函数来捕获超时后要执行的函数。
第二个使用eval()来评估您的字符串,这可能比第一个选项慢(不管使用eval()的原因如何)。
第三个在5秒内显示元素,然后在完成后立即隐藏,因此与第一个不同。
更新: nickf的更新提示我查看源代码,如果元素已可见,则第3个将立即执行。以下是相关的源代码行。
if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) 
    return opt.complete.call(this);

嗨,Russ,为什么最后一个不好,就像mck89所解释的那样?请您发表一下您的想法。 - drummer
因为第三个选项会在5秒钟内显示元素,正如nickf所说,使用选项3代码时您的意图并不明确。 - Russ Cam

2
在选项一和选项二之间,选项一更好,因为它不需要评估字符串以将其转换为可执行代码。
选项三并不做同样的事情。它可能具有相同的输出,但只是因为使用了其他需要很长时间才调用所需函数的方法。这非常低效,而且不能准确地显示你想要做的事情。
选择选项一。
编辑:实际上,我刚刚测试了你的选项三,并且可以说,如果元素可见,则回调会立即发生,无论你传递给show()函数的超时时间是多少。

@nickf - 很有趣。我查看了源代码,似乎是这些行 - if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) return opt.complete.call(this); 在第3875行和第3876行。 - Russ Cam
谢谢Nick。有时候当每个答案都有其优点时,选择一个答案很难。 - drummer

0

使用第一种方法,您将失去将该函数与其他函数连接的能力。第二种方法是一个已评估的字符串,因此您必须小心上下文,并且无论如何它都不利于性能。最后一种方法更好,因为在此之后,您可以调用其他jQuery方法,而且jQuery还具有更好的时间管理。


3
你说:“jQuery在时间管理方面也更好。”我说:“需要引用文献”。 - nickf
如果你看一下 jQuery 代码,它有一些以特定方式管理时间的函数(比如 animate())。我不知道 show() 是否是其中之一,但如果你包含了 jQuery,最好使用它的方法。 - mck89
1
他所说的“concatenation”,指的是“函数链”。$x.doSomething().doSomethingElse().etc()。无论如何,jQuery处理时间与JavaScript的其余部分完全相同,使用超时和间隔,就像前两个示例中一样。 - nickf
你知道吗?我改变了想法。第一个方案更好。使用第一个方案,您不会失去连接。而使用最后一个方案,您可以连接其他函数,但我认为这是无用的,因为如果您需要在该对象上调用其他函数,则应在触发隐藏方法后调用它们,而使用最后一个方案则无法等待,而使用第一个方案则可以。 - mck89
我刚刚阅读了源代码 :) 确实有一个队列系统来管理动画,但在内部,据我所见,它使用了 setInterval() - Russ Cam
显示剩余4条评论

0

第一个示例和第三个功能不同,第一个隐藏了“# secret” 5秒钟,而第三个会慢慢执行5秒钟,这完全取决于你想做什么。


-3

因为您正在使用jQuery,我认为您应该使用第三个。
没有jQuery的情况下,第一个比第二个更好,因为在第二种情况下,JS引擎必须评估表达式,在第一个中则不需要。


楼主在这里,感谢回答。我想说的是,我不是那个给你点踩的人。也许那个人也能解释一下为什么会这样。 - drummer
可能是因为我打错了几个字 :) - giolekva
1
我没有投票反对,但它可能被投票反对是因为他使用 #3 的理由真的很糟糕。仅仅因为你正在使用 jQuery,并不意味着你应该在做任何事情时都使用 jQuery 函数。另外,#1 和 #3 并不是相同的东西。 - mkoryak
1
-1,冰箱里有酸奶并不意味着我应该每顿饭都吃酸奶。 - Malfist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接