为什么要动态删除它们?动态更改代码是不必要的,而且在这种情况下,一袋蠕虫会过度使用。你应该使用一个标志。
我将分别回答您是要跳过一大组 if 语句还是单个 if 语句。
前言
正如您问题的评论中提到的,运行分析以确保您知道性能问题在哪里!
您提到您不喜欢简单地使用布尔标志来使 if 语句不在您的答案中运行。这很好,这是人们通常会做的事情。这不应该是一个实际的性能问题,并且分析可能会显示您的性能问题存在于其他地方。如果他们不这样做,并且这个布尔标志检查确实是您的瓶颈 - 您会遇到更大的问题,例如对 JavaScript 代码的期望过高,或者您没有正确使用分析工具,或者误解了它的结果。
如果您试图避免运行 if 语句的主体或其条件,那么与布尔标志检查本身相比,这些对您来说是更大的性能问题。
用于跳过一大组 if 语句
将一堆if语句包装在一个条件中。
if (runBunchOfIfStatements) {
// all those if statements here
}
当您不想运行这些 if 语句时,请将runBunchOfIfStatements
标志设置为 false(当然,您可能应该选择一个比这更有意义的名称)。
也就是说,8 或 9 个 if 语句是一个代码长度问题,而且很可能对性能问题毫无意义——除非那些 if 语句碰巧涉及非常密集的检查。如果您只是因为有很多if检查而担心,那么您可能找错地方了。
对于单个 if 语句
假设您只有一个要跳过的 if 语句。您的答案中有此代码:
} else if (x > 300 && !doneSomething2) {
doSomething2();
doneSomething2 = 1;
}
这可以。你只是做一个小检查:见前言。在其他地方寻找您的性能问题。可以稍微重写它以更严格地遵循约定(我即将达到),但在这种情况下,更改的影响可以忽略不计。
让我们假设这里实际上存在性能问题。假设x > 300
你正在做一些更密集的事情,而不是检查calculateSeveralSquareRoots()
。通常,您确实采用这种方法,但您重新排列它是这样的:
} else if (needCalculations && calculateSeveralSquareRoots() {
// do stuff
needCalculations = false;
}
这里的区别是标志needCalculations
是第一位的,而不是第二位的。JavaScript 的比较运算符有短路求值。这意味着当评估时a && b
,如果a
为假,b
甚至永远不会被检查——我们已经知道结果将是假的。如果标志先出现,这意味着calculateSeveralSquareRoots()
永远不会运行,并且您可以节省检查时间。
如果标志位居第二,那么您可能会在该函数上浪费大量时间,因为该标志可能几乎总是解析为假。
因此,在您的原件中,您可以在评估之前x > 300
使用标志,只是为了遵循惯例。但是同样......如果这样的 if 语句对您来说是一个真正重要的性能问题,那么您有更大的问题。