javascript - 函数表达式有什么意义,它们似乎没用
问题描述
如果这是重复的,我很抱歉,我已经阅读了一些提出这个问题的帖子,但我还没有找到令人满意的答案。我是 JS 新手,我使用过 C 和 Java。我最近了解了函数表达式,据我所知,它是分配给某个 const 变量的匿名函数声明。我看不出这背后的动机是什么/它的可能用途是什么/这怎么可能做一些你不能用函数声明做的事情。例如
const example = function (input){
return 'Am I useless?:' + input;
}
console.log(example('Idk'));
就像这样调用具有相同变量的已声明函数,但我使用的是这个变量名 ( example
),这也使anonymous
函数看起来是伪匿名的,因为它确实有一个可以引用的名称。
我看不出这比仅仅一个函数声明更可取,但是我正在学习的 CodeCademy 课程反复使用函数表达式,所以我一定遗漏了一些东西。
我非常感谢您的帮助/澄清。
解决方案
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
(和函数声明)允许的奇怪怪癖 - 使用临时死区提升(在声明之前无法访问)
推荐阅读
- javascript - 使用数组列表在 D3 中创建多个圆
- json - 试图解析 json,似乎无法解析数组内的数组
- javascript - React:useEffect 是否不能保证在组件渲染之前运行?
- r - 词干问题 - 无法正确词干,并且在 R 中使用绘图进行识别
- python - 如何在 tkinter 中在所有 4 个方向上加速和减速一个物体?
- python - 使用 __eq__ 在 Python 中修改类
- linux - /bin/bash^M:错误的解释器:没有这样的文件或目录
- arrays - 我需要一个辅助函数来使用 ngFor 遍历复杂的对象数组
- c++ - 使用引用变量修改类私有变量
- regex - 如何使用正则表达式提取参数?