【发布时间】:2012-07-18 14:00:16
【问题描述】:
在这种情况下,该网站是一个只能在 IE6 上查看的内部网站。目标是让它在 IE9 中可见。有几个仅适用于 IE 的脚本,例如使用xml data islands,通过点符号访问文档元素,即resulttable.style.display = "block"; 等......上述对于手头的问题可能有点多余,但它可以提供一些见解.
在整个网站中,有大量的 JavaScript 方法,它们非常庞大且难以调试。给你一个想法,有超过 100 个 JS 文件,每个平均大约 1000 行。
以下是省略了所有名称/逻辑的实际方法。所有的返回值都依赖于之前的逻辑:
function someMethod() {
if (stuff) {
// operations
if (stuff) {
// operations
for (loop) {
// operations
if (stuff) {
// operations
if (stuff) {
// operations
for (loop) {
if (stuff) {
// operations
}
}
// operations
}
else {
// operations
if (stuff) {
// operations
} else {
// operations
}
}
// operations
}
}
// operations
if (stuff) {
// operations
if (stuff) {
// operations
if (stuff) {
// operations
for (stuff) {
// operations
if (stuff) {
// operations
} else {
// operations
}
}
if (stuff) {
// operations
if (stuff) {
// operations
for (loop) {
// operations
}
// operations
for (loop) {
if (stuff) {
// operations
}
}
}
// operations
if (stuff) {
// operations
}
return something;
}
else {
// operations
return something;
}
}
else {
// operations
if (stuff) {
// operations
return something;
}
else {
// operations
if (stuff) {
// operations
}
// operations
return something;
}
}
}
}
return something;
}
else {
// operations
return something;
}
}
return something;
}
在处理旧网站时,您有什么建议将 JavaScript 方法分解成更易于管理的部分?
免责声明:我的 JS 技能处于平均水平。我们现在想避开 JQuery。
【问题讨论】:
-
jQuery 会为你做很多 ifs(我假设这些 ifs 与你所说的每个浏览器特性有关),所以我认为学习它并把它用于重构您的代码。
-
我建议你使用一个工具。请参阅我的question 和提供的答案
-
@davidbuzatto - 这些是大型逻辑流程语句;与浏览器特性无关。也许帖子没有传达这一点,但当前网站是为 IE6 设计的,没有其他浏览器。
-
我真的不认为这是特定于 javascript 的。如果一个方法太大,把它拆分成几个逻辑方法,使其更具可读性。
-
首先,我将开始为每个 js 文件创建命名空间,并仅使用该文件的功能填充这些命名空间。类似于: var MyNamespace = {}; MyNamespace.myFunction1 = function() {};等等。有了这个,我将开始重构每个函数,提取整个系统通用的块并将它们插入到 Utils 命名空间中,例如,特定于我正在工作的命名空间的块。提取后,我将开始重构每个功能,不使用任何专有功能。最后,我将对结果进行更多模块化。
标签: javascript refactoring legacy-code