在JavaScript中使用函数表达式有什么好处吗?

时间:2016-01-18 08:36:54

标签: javascript function expression declaration forward-declaration

我最近加入了一个大型软件开发项目,该项目主要使用JavaScript,从第一天开始就有一个特定问题。我知道这个问题以前一直在这里,但我从来没有看到核心问题得到妥善回答。所以我在这里再问一次:

JavaScript在使用函数表达式而不是函数声明方面有什么好处吗?

换句话说,是这样的:

var myFunction = function () {
  // Nice code.
}

以任何方式比这更好:

function myFunction () {
  // Nice code.
}

正如我所看到的,函数表达式只在代码库的几个层次上引入了负面的方面。我在这里列出了一些。

  1. 如上所述,函数表达式会突然强制您注意前向引用,因为myFunction变量引用的匿名函数对象在变量表达式实际执行之前不存在。如果使用函数声明,这绝不是问题。

  2. 除了生成两倍于函数声明的对象外,这种用法引入了一种非常糟糕的编程习惯,即开发人员只有在觉得需要它们时才会声明它们的功能。结果是代码将对象声明,函数表达式和逻辑混合在一起,模糊了一段代码的核心逻辑。

  3. 作为2)的副作用,代码变得更难阅读。如果您对代码中实际可变的对象使用正确的函数声明和var声明,则扫描代码段的缩进行并快速查找对象和函数变得更加容易。当一切都被宣布为" var"时,你会被迫更加仔细地阅读以找到这条信息。

  4. 2)另一个令人讨厌的副作用,当用户陷入只在他们觉得需要时声明他们的功能的坏习惯时,函数表达式开始出现在事件处理程序和循环中,有效地创建了一个新的每次调用事件处理程序时或循环中的每次转弯时,都会复制函数对象。不用说,这很糟糕!这是一个显示我的意思的例子:

    var myList = [' A',' B',' C'];

    myList.forEach(function(element){

    // This is the problem I see.
    var myInnerFunction = function () {
        // Code that does something with element.
    };
    

    };

  5. 总而言之,至少在我看来,唯一可以使用以下内容的情况:

    var myFunction = function () {
      // Nice code.
    }
    

    是指您的逻辑打算在执行期间将myFunction引用更改为指向不同的函数。在那种情况下,myFunction(变量)在代码中是可变的,因此您正确地向不同的程序员通知您的意图,而不是让他/她感到困惑。

    考虑到这个背景,我再次提出我的问题。我是否遗漏了关于函数表达式(在上面描述的上下文中)的中心内容,它们在函数声明中提供了任何好处?

0 个答案:

没有答案