Javascript 在这种情况下使用 IF 或 SWITCH 或“动态函数名”的最佳实践是啥

Posted

技术标签:

【中文标题】Javascript 在这种情况下使用 IF 或 SWITCH 或“动态函数名”的最佳实践是啥【英文标题】:Javascript What is best practice using IF or SWITCH or "dynamic function name" in this caseJavascript 在这种情况下使用 IF 或 SWITCH 或“动态函数名”的最佳实践是什么 【发布时间】:2014-01-21 12:26:23 【问题描述】:

我正在寻找这种假设情况下的最佳实践。

在下面的示例中,函数changeGallery0() 是一个独特的函数,它与changeGallery1()、changeGallery2() 不同。他们不能被修改来解决这个问题。但是每个函数确实采用完全相同的数据(newArrayData)

这段代码看起来“丑陋”,但可以正常工作。如果有 20 个画廊,它会变得更加丑陋。我意识到调用独特函数存在一些问题,但这有助于说明我的问题。

使用 SWITCH 案例似乎更合适。但与这种基于 IF 的解决方案相比,它有什么优势吗?似乎“动态函数名称”(是否存在)有意义?

谢谢!

if (a == 0) changeGallery0(newArrayData);
if (a == 1) changeGallery1(newArrayData);
if (a == 2) changeGallery2(newArrayData);
if (a == 3) changeGallery3(newArrayData);

【问题讨论】:

为什么你不能有一个名为 changegallery(newArrayData,galleryNumber) 的函数,然后使用它仅在该函数内的特定代码上进行分支。这样,如果至少在将新变量添加到 newArrayData 或其类型更改时需要进行常见更改,则您可能必须更新所有函数。 为了记录,switch 通常比 if/else 快。见this question。 是的,但是对于这个问题,我想假设 newArrayData 不会改变。例如 newArrayData 是一个 URL 字符串数组。 【参考方案1】:

你可以试试这样的:

var fn = window['changeGallery' + a];
if (typeof fn === "function")  
    fn.apply(null, newArrayData);

“apply”的第一个参数是函数调用中的“this”。

【讨论】:

问题:这个答案和下面丹尼的答案的区别是这会在调用之前测试函数是否存在? 是的......如果你愿意,你可以在你的方法中将“this”范围设置为不同的东西。【参考方案2】:

你可以这样做

window["changeGallery" + a](newArrayData);

【讨论】:

【参考方案3】:

我认为使用 for 循环会更好。您可以将函数放在数组中。

var funcArray = [function1, function2 , function3, ...];

【讨论】:

【参考方案4】:

您需要了解一件事,那就是 if else 或 switch 将如何发生分支。

    如果 a 为 0,则 if else 将命中第一个,然后您会错过其余 3 个,但仍需要检查条件。 使用 switch,您将完成分支,但实际代码将在一个之后中断,并且不检查其余条件。

你可以通过 if 使用 else 语句来达到同样的效果 如果 a 不是 0 则检查它是否为 1 否则不需要这样做 如果 a 不是 1 则检查它是否为 2 否则不需要这样做 这将创建类似于 switch 分支的嵌套 if else 语句,并且 switch 在代码中会更好地阅读,所以使用它。

【讨论】:

以上是关于Javascript 在这种情况下使用 IF 或 SWITCH 或“动态函数名”的最佳实践是啥的主要内容,如果未能解决你的问题,请参考以下文章

HTML 5 Gaming 是不是使用 Canvas 和 Javascript?在这种情况下如何防止作弊?

为啥这个 if 语句在这种情况下不起作用? [关闭]

在这种情况下,是不是有比 if-else 更快的替代方法?

Javascript 音频播放在这种情况下不起作用

javascript语言啥情况下用try比用if好?

在这种情况下将 javascript 变量数据传递给 MySQL 数据库