首页 > 解决方案 > 函数表达式有什么意义,它们似乎没用

问题描述

如果这是重复的,我很抱歉,我已经阅读了一些提出这个问题的帖子,但我还没有找到令人满意的答案。我是 JS 新手,我使用过 C 和 Java。我最近了解了函数表达式,据我所知,它是分配给某个 const 变量的匿名函数声明。我看不出这背后的动机是什么/它的可能用途是什么/这怎么可能做一些你不能用函数声明做的事情。例如

const example = function (input){
   return 'Am I useless?:' + input;
}

console.log(example('Idk'));

就像这样调用具有相同变量的已声明函数,但我使用的是这个变量名 ( example),这也使anonymous函数看起来是伪匿名的,因为它确实有一个可以引用的名称。

我看不出这比仅仅一个函数声明更可取,但是我正在学习的 CodeCademy 课程反复使用函数表达式,所以我一定遗漏了一些东西。

我非常感谢您的帮助/澄清。

标签: javascriptecmascript-6

解决方案


TL;DR:不,函数表达式不是没用的。


首先,我会从函数表达式中导出函数声明,而不是反过来。函数声明也很有用,但它们可以完全由函数表达式代替。

主要区别:函数声明总是创建变量,而函数表达式不。但是,您仍然可以将它们分配给变量。

以下代码是相同的(好吧,不完全相同,它们的提升规则不同):

function foo(bar){
  return 'baz'
}
//Function declarations create variables like how `var` does
var foo = function foo(bar){
  return 'baz'
}

但是,当您不想将函数存储到var⁠iable 中时,函数表达式会变得很方便。

示例包括:

  • 常量函数:

    const foo = function foo(bar){
      return 'baz'
    }
    
  • 块作用域函数:

    {
      let foo = function foo(bar){
        return 'baz'
      }
    }
    
  • IIFEs(立即调用函数表达式):

    (function (bar){
      //Here we have an encapsulated local scope and the ability to return things
      return 'baz'
    })('foo')
    
  • 回调:

    asyncFn(function (){
      console.log('Done!')
    })
    
  • 存储在对象中:

    foo[2].bar = function (){
      return 'baz'
    }
    
  • 分配给先前声明的变量:

    let foo = null
    console.log(foo)
    foo = function foo(bar){
      return 'baz'
    }
    

而且,尽管从技术上讲,上述所有问题都可以通过仅使用函数声明来解决,但这会导致大量不必要的变量和难以阅读的代码。


我不完全知道为什么 Code Academy 更喜欢在您的情况下使用函数表达式,但我认为关键在于const关键字,因为它是:

  • 块作用域
  • 持续的
  • 限制var(和函数声明)允许的奇怪怪癖
  • 使用临时死区提升(在声明之前无法访问)

推荐阅读