定义JavaScript函数

定义JavaScript函数,javascript,jslint,eslint,Javascript,Jslint,Eslint,在我的项目中(仅浏览器上下文),我想使用JS代码质量工具。我尝试了jslint和eslint。我希望linter帮助我使代码干净、清晰、防错,并提高其整体质量。我不想做的是,我不想写一些下流的文章,也不想用不好的做法来取悦林特斯 我只关心一个问题。他们都报告了一个问题,我在定义函数之前使用了它。显然,在下面的代码片段中,bar在定义之前不会被调用 function foo() { bar(); } function bar() { } foo(); 在这个最简单的场景中,我可以在

在我的项目中(仅浏览器上下文),我想使用JS代码质量工具。我尝试了
jslint
eslint
。我希望linter帮助我使代码干净、清晰、防错,并提高其整体质量。我不想做的是,我不想写一些下流的文章,也不想用不好的做法来取悦林特斯

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

function foo() {
    bar();
}

function bar() {

}

foo();
在这个最简单的场景中,我可以在
foo
之前移动
bar
。但在有些情况下,这是不可能的。第一个函数使用第二个函数,第二个函数使用第三个函数,第三个函数使用第一个函数

似乎我可以通过在定义之前声明所有函数来满足Linter的要求

var foo;

var bar;

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

bar = function() {

};

foo();
问题是:

  • 第一个代码段是否已损坏?我想——不是
  • 第一个代码段容易出错吗?我想——也许吧
  • 像第二个代码段那样组织代码(在定义函数之前声明函数)是一种好做法吗
  • 如果
    我应该坚持这种做法,不是吗
  • 如果
    关于此问题的最佳做法是什么
  • 这个林特错误值得注意还是我应该禁用它

不,代码片段没有中断,但也不是最佳做法

var foo = function(){

}

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

bar();
实际上将成为:

var foo, bar;

foo = function(){

}

bar = function(){
  foo();
}

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

自己动手做被认为是最佳实践,可以提高可读性

Eslint将对照已定义和记录的规则顶部变量进行检查

  • 第一个代码段是否已损坏?不,它没有坏
  • 第一个代码段容易出错吗?没有
  • 像第二个代码段那样组织代码(在定义函数之前声明函数)是一种好做法吗?不,还有很多其他的好方法
  • 如果是,我应该坚持这种做法,不是吗?对
  • 如果没有,关于这个问题的良好做法是什么?你可以遵循很多好的模式
  • 这个林特错误值得注意还是我应该禁用它?注意保持代码干净是件好事
  • 始终使用严格模式<代码>“严格使用”

    你有没有因为没有全局变量而在像IIFE这样的范围内使用函数


    你试过在你的代码中切换
    foo
    bar
    的位置吗?@Justinas在这个最简单的场景中,我可以在foo之前移动bar。但在有些情况下,这是不可能的。第一个函数调用第二个函数,第二个函数调用第三个函数,第三个函数调用第一个函数。也许就我所知,第一个函数比第二个函数更安全。甚至连皮棉都怪他。原因是,在javascript中,函数只有在所有函数都已定义的情况下才会执行,因此只有在永远不会定义bar()时才会出现问题。在第二种情况下,可以在未定义bar()时执行它。只是因为在bar()定义之前调用了foo()。这是因为在第二种情况下,您将函数分配给变量,这些变量在声明/定义中具有不同的行为。我找到了规则的解释,这更详细地说明了我在上一篇文章中试图解释的内容。您可以研究一下,所以第二个代码片段被认为是一个很好的实践,对吗?关于提升,我不是专家,但在js中变量声明不会移动到范围的顶部,只有函数声明。示例:函数asd(){console.log('1:'+asdvar);var asdvar='sir asdalot';console.log('2:'+asdvar);}@kailnris声明被移动,而不是asignment;)@TimHallyburton是的,它是真的,在这个例子中,变量是在局部范围内创建的:function asd(){asdvar='asd2';var asdvar;}
    所以第二个代码片段被认为是一个好的实践,对吗?
    我意识到我在重复我前面的注释,但不,不是真的。在这个简单的例子中,我认为没有理由不使用
    函数foo
    函数栏
    。在实际情况中(
    a
    调用
    b
    ,调用
    c
    ,调用
    a
    )。。。JSLint是一个linter,并不是真正打算作为代码审查的替身,但它确实有助于识别代码气味。如果你有这样的乱伦电话,发现自己在执行奇怪的舞蹈以绕过规则,那么也要考虑一个全面的代码审查。正如您在他的编辑中所看到的,将声明放在代码段的顶部解决了问题。很可能eshint检查了“顶部的变量”(如我的答案中所链接的),我理解,但这是lint的选择问题,我猜:-)我宁愿不在顶部预先定义变量
    function foo() {
        bar();
    };
    
    function bar() {
    
    };