定义JavaScript函数

Kol*_*nya 12 javascript jslint eslint

在我的项目中(仅限浏览器上下文)我想使用JS代码质量工具.我都试过jslinteslint.我希望linter帮助我使我的代码干净,清晰,错误并提高其整体质量.我不想做的是我不想写一些肮脏的黑客或使用不好的做法只是为了让傻瓜高兴.

我只关心一个问题.他们都报告了一个问题,我在定义之前使用了一个函数.显然,在下面的代码片段中bar,在定义之前不会调用它.

function foo() {
    bar();
}

function bar() {

}

foo();
Run Code Online (Sandbox Code Playgroud)

在这个最简单的场景中,我可以bar先行动foo.但有些情况下,这是不可能的.第一个功能使用第二个,第二个使用第三个,第三个使用第一个.

看起来我可以通过在他们的定义之前声明所有函数来使这些变得快乐.

var foo;

var bar;

foo = function() {
    bar();
};

bar = function() {

};

foo();
Run Code Online (Sandbox Code Playgroud)

问题是:

  • 第一个代码段是否已损坏?我猜不会.
  • 第一个代码片段是否容易出错?我猜 - 也许吧.
  • 组织代码(如第二个代码段)(在定义函数之前声明函数)是一个好习惯吗?
  • 如果yes我坚持这种做法,不应该吗?
  • 如果no这个问题的良好做法是什么?
  • 这个linter错误值得关注还是我应该禁用它?

Tim*_*ton 2

不,这些片段没有损坏,但也不是最佳实践。

var foo = function(){

}

var bar = function(){
  foo();
}

bar();
Run Code Online (Sandbox Code Playgroud)

实际上会变成:

var foo, bar;

foo = function(){

}

bar = function(){
  foo();
}

bar();
Run Code Online (Sandbox Code Playgroud)

因此,您应该在范围的开头定义所有变量和函数。JavaScript 使用 Hoisting 它有效地将变量和函数的所有声明移动到作用域的顶部。

自己动手被认为是最佳实践并增加了可读性。

Eslint 将检查此处定义和记录的规则vars-on-top

https://www.reddit.com/r/learnjavascript/comments/3cq24a/crockford_says_hoisted_variable_declarations_are/ https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/