我该如何在JS中将一个方法标记为“已过时”?

91

我正在重构一个非常庞大的JS文件,里面包含许多无关的方法,并将这些方法重新分组,根据它们的用途,并根据需要更改一些名称(以防止名称误导)。

然而,实际使用此代码的大多数Web页面分布在不同的代码分支中,阻止我进行简单的查找和替换。我可以在所有不同的分支中执行此操作,但这需要同时在30多个分支中进行维护,或者可能会在合并其他分支时(由我或其他团队成员)忘记执行重命名。

如果这是C#,我只需用[Obsolete]标记该方法即可标记必要的更改,因此我正在寻找某种相当等效的方法。我仍将使用旧接口提供功能一段时间,只需将调用重定向到新方法即可,但我希望"强制"人们在处理其他原因的页面时切换到新接口。

除了向每个方法添加debugger;语句和详细的注释以使其在开发时中断但在生产环境中不中断之外,是否有其他类似的方法?


我不知道有任何足够的静态分析工具来解决这个问题 - 在大多数动态语言中似乎是一个弱点。 - user2864740
你知道自己是在生产环境还是开发环境工作吗(例如变量debug=true)? - megawac
@megawac 我不相信在JavaScript方面,我们在调试和发布之间有任何不同。不过,在C#方面,我可以明确地解决这个问题(也许通过在页面中注入一个变量来进行调试?) 其他开发人员明确地在调试模式下进行编码和测试,而我们所有的生产代码都是在发布模式下。 - JBG
7
如果你有一个调试变量,你可以使用类似if(debug){console.warn("using obsolete method")}的语句来判断是否需要进行调试。请注意,这种方法只是提供了一种快速的调试方式,不应该在生产环境中使用。 - megawac
3个回答

162

过渡期有几件事情可以做:

  1. 添加 @deprecated JSDoc 标志。
  2. 添加控制台警告消息,指示该函数已被弃用。

示例:

/**
 * @deprecated Since version 1.0. Will be deleted in version 3.0. Use bar instead.
 */
function foo() {
  console.warn("Calling deprecated function!");
  bar();
}

0
function obsolete(oldFunc, newFunc) {
  const wrapper = function() {
    console.warn(`WARNING! Obsolete function called. Function ${oldFunc.name} has been deprecated, please use the new ${newFunc.name} function instead!`)
    newFunc.apply(this, arguments)
  }
  wrapper.prototype = newFunc.prototype
  return wrapper
}

1
假设我有一个名为fun1的函数,我想将其弃用并使用新函数fun2。我该如何使用这个obsolete函数?它似乎很有趣。 - whitecircle
obsolete(fun1, fun2) - Josh Wulf
好主意,谢谢!这仅适用于两个函数是可调用兼容的情况,即它本质上只是一个重命名。根据我的经验,这仅适用于过时部分的一小部分。 - Marcel Waldvogel

0
这是有关Visual Studio 2013的一些发现:http://msdn.microsoft.com/en-us/library/vstudio/dn387587.aspx 由于我们还没有进行转换,因此尚未经过测试,但看起来很有前途。
同时,我会根据上下文在页面加载时插入一个标志,例如:
<%
#if DEBUG
    Response.Write("<script type=\"text/javascript\"> Flags.Debug = true; </script>");
#endif
%>

然后我调用一个方法,如果标志为真则抛出错误,如果在发布配置中则重定向到新的调用。


3
这似乎是一个 .Net 的答案。这个问题上没有 .Net 标签。 - Liam

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