【问题标题】:Why does ReSharper warn a function is used before it is declared?为什么 ReSharper 在声明函数之前会发出警告?
【发布时间】:2015-06-30 14:42:22
【问题描述】:

我编写了如下布局的 JavaScript 代码:

function MyObject() {
    this.doSomething(){
        someSubRoutine();
    }

    function someSubRoutine(){
        //Sub-routine code here
    }
}

ReSharper 警告我

函数“someSubRoutine”在声明之前使用

确实,函数在声明之前就已使用,但 ReSharper 建议我在使用之前声明函数是否有实际原因?我认为由于 JavaScript 的提升能力,这不会是一个问题。我应该遵循这个建议还是继续忽略它?

【问题讨论】:

  • 除了良好的编码习惯和可读的代码之外,没有任何实际原因(你不会有错误),因为 Javascript 是整体解析的(因为 DOM 在被完全遍历之前总是作为标记语言编译)
  • ReSharper 警告了很多它不应该做的事情。它还特别擅长破坏实体查询,因此 EF 无法在运行时针对 SQL 数据源处理它们。
  • 有许多角度风格指南(如 this one 建议以“不良做法”的方式进行操作以提高可读性。因为大多数编码工具会使用键盘快捷键将您带到函数定义,看来2016年这个规定很傻。

标签: javascript resharper-9.0


【解决方案1】:

ReSharper 可能在后台使用 JSLint(或 JSHint),这些 linting 工具通常会警告这种做法。

这个问题归结为一个名为“吊装”的主题,该主题已被大量讨论(例如,Sitepoint)。在某些情况下,在 JS 解释器有机会声明它之前使用方法或变量是可能的......所以“最佳实践”是在第一次使用之上的某个地方声明。

编辑: 这是一个提升可能会导致意外副作用的示例:

var showState = function() {
    console.log("Idle");
};

function showState() {
  console.log("Ready");
} 

showState();            // output: Idle

这是因为 JS 解释器在运行时使用提升来创建以下内容:

function showState(){        // moved to the top (function declaration)
    console.log("Ready");
} 

var showState;               // moved to the top (variable declaration)

showState = function(){      // left in place (variable assignment)
    console.log("Idle");
};

showState();

【讨论】:

  • 提供的链接做了很好的解释和示例来解释在 JS 解释器将其设置为等于函数之前可以访问变量的情况。就我而言, someSubRoutine 似乎永远不会成为问题,因为函数总是被提升到顶部。也就是说,我可以将其归结为 ReSharper 过于谨慎并遵循良好的编码实践。我会将链接中提供的示例添加到您的答案中,以防止链接不再可用时丢失。
  • Resharper 会提示你合并赋值和声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
相关资源
最近更新 更多