我正在开始学习React,现在回到一些更基础的JavaScript概念。
我已经学会了函数表达式和函数声明之间的区别,但是仍然困惑于为什么函数表达式不被称为函数声明。
如果这是一个变量声明:
const foo = 5;
那么为什么这被称为函数表达式呢?
const bar = function() {
// Some code
};
在第二个例子中,“const bar”不是在声明吗?为什么函数表达式和函数声明被称为它们的样子?为什么函数表达式没有被称为函数声明,反之亦然?
我正在开始学习React,现在回到一些更基础的JavaScript概念。
我已经学会了函数表达式和函数声明之间的区别,但是仍然困惑于为什么函数表达式不被称为函数声明。
如果这是一个变量声明:
const foo = 5;
const bar = function() {
// Some code
};
const g
。我们还看到有一个函数被创建并分配给了g。我们正在处理function() {}
的结果(将其分配给某个东西),这意味着JavaScript将把它解释为函数表达式。function f() {}
我们没有将此函数用作表达式(在创建后没有进行任何其他操作),因此JavaScript实际上会将其与我们的第一个示例区别对待。它将在本地命名空间中声明f,并应用function hoisting。如果您只是在function f() {}
之前添加一个+
,那么您将导致JavaScript将其解释为表达式,这些功能将被禁用。您可以在开发工具中尝试一下-输入+function f(){}
或const g = function f(){}
,然后f将保持未定义状态。await x
是一个表达式,但 () => await x
不是有效的,因为 await
没有直接在 async
函数内使用。此外,整个 const foo = 5
是一个声明。const foo = 5
来自 const
Identifier =
_AssignmentExpression_,它派生自 const
_BindingIdentifier Initializer_,派生自 _LetOrConst LexicalBinding_,来自 LexicalDeclaration。const foo
是语法错误。 - Sebastian Simonconst foo = 5
既是声明又是默认初始化。我尝试划分这个语句的哪一部分声明了"foo"作为一个常量,哪一部分是默认初始化它,可能是不公平的,因为它们都需要才能工作 - 但我仍然保留它,因为这使得答案更容易理解(我已经澄清了我的措辞,让它听起来不那么强硬)。 - Scotty Jamisonconst bar = function() {
// Some code
};
VS 函数声明
function foo() {
// Some code
};
const bar
的初始化是一个函数表达式,因为像这样初始化已声明变量的任何内容都是某种形式的表达式。 - Pointyconst foo
是变量声明,5
是一个表达式,而不是声明。考虑const foo = 1 + 1
。很明显,1 + 1
是需要计算的表达式。 - slebetmanconst
LexicalBinding →const
BindingIdentifier Initializer →const
Identifier=
AssignmentExpression → [跳过20步] →const foo =
PrimaryExpression →const foo =
Literal →const foo =
NumericLiteral → [跳过4步] →const foo = 5
。第二个代码块在 Literal → FunctionExpression → 等处分歧。请参见规范。FunctionDeclaration 来自 Declaration → _HoistableDeclaration_。 - Sebastian Simon