为什么ReSharper警告函数在声明之前被使用?

pud*_*n13 4 javascript resharper-9.0

我编写了一个带有布局的JavaScript代码,如下所示:

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

    function someSubRoutine(){
        //Sub-routine code here
    }
}
Run Code Online (Sandbox Code Playgroud)

ReSharper警告我

函数'someSubRoutine'在声明之前使用

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

art*_*kay 6

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

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

编辑: 以下是提升可能导致意外副作用的示例:

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

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

showState();            // output: Idle
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

  • 提供的链接有一个很好的解释和示例来解释在JS解释器将其设置为等于函数之前可以访问变量的情况.在我的情况下,似乎someSubRoutine不会成为问题,因为函数总是被提升到顶部.也就是说,我可以将其归结为ReSharper过于谨慎并遵循良好的编码习惯.我将添加链接中提供的示例到您的答案,以防止它在链接不再可用时丢失. (2认同)