为什么叫函数表达式而不是函数声明呢?
Why is it called a function expression and not a function declaration?
我开始学习React了,现在又在绕回JavaScript中的一些比较基础的概念。
我知道了函数表达式和函数声明的区别,但是我还是很疑惑为什么函数表达式不叫函数声明
如果这是一个变量声明:
const foo = 5;
那为什么叫函数expression?:
const bar = function() {
// Some code
};
第二个例子,不是声明了“const bar”吗?为什么函数表达式和函数声明是这样命名的?为什么函数表达式不称为函数声明,反之亦然?
Then why is this called a function expression?:
给一个变量赋值,其实就是一个表达式。在您的示例 foo = 5
中,这是一个表达式。您还声明了 foo
,但它仍然是一个表达式。
类似地,另一个例子const bar = function() {}
被称为函数表达式以区分函数声明和函数表达式。
函数表达式
const bar = function() {
// Some code
};
与函数声明
function foo() {
// Some code
};
有趣的问题。措辞可以有软边界,这在一定程度上是造成这种混淆的原因。
首先,一些粗略的定义:
- 表达式:我认为这是最好的例子。
2 * 2
是一个表达式,因为你可以继续对它进行其他操作,比如 2 * 2 - 3
。另一方面,if (...)
不是 javascript 中的表达式,它不会解析为您可以对其进行进一步操作的值。做if (...) {...} / 2
是无效的。这个“定义”有一些漏洞,但对于这个答案来说应该足够好了。
- 声明: 声明就是声明你要使用某个变量名。因此,在您使用
const foo = 5
的示例中,实际声明的是 const foo
部分,= 5
只是初始化声明。
考虑到这一点,让我们考虑两个函数示例,看看这个术语在这些示例中的作用:
const g = function() {}
这里有一个声明,const g
。我们还看到正在创建一个函数并将其分配给 g。我们正在用 function() {}
的结果做某事(我们将它分配给某物),这意味着 javascript 会将其解释为函数表达式。
function f() {}
我们没有将这个函数用作表达式(在创建它之后我们没有对它进行任何额外的操作),所以 javascript 实际上将把它与我们的第一个例子不同。它将在本地命名空间中声明 f,并将应用 function hoisting。如果您只是在 function f() {}
之前添加一个 +
,那么您将导致 javascript 将其解释为表达式,并且这些功能将被禁用。您可以在开发工具中尝试 - 输入 +function f(){}
或 const g = function f(){}
,f 将保持未定义状态。
javascript 在不同上下文中以不同方式对待 function 关键字这一事实是这种语言选择的核心。您几乎可以认为“function”关键字具有两种不同的含义,所选择的含义取决于上下文。任何时候在表达式上下文中使用函数或未命名函数时,它都采用“表达式”形式,我们称其为“函数表达式”。否则,它采用包含一些额外功能的替代形式,例如将函数名称声明为局部变量。这可能就是我们采用将这种替代形式称为函数声明的原因。但是,就像 OP 正确指出的那样,即使使用 const f = function() {}
,声明仍在进行,只是 function
关键字没有发生。
脚注:对于像 +function f() {}
这样的示例,f 不会在与 g 相同的范围内定义,但它 确实 在 f 的主体内定义。换句话说,任何命名函数表达式 声明 它的名字在它自己的体内。
我开始学习React了,现在又在绕回JavaScript中的一些比较基础的概念。
我知道了函数表达式和函数声明的区别,但是我还是很疑惑为什么函数表达式不叫函数声明
如果这是一个变量声明:
const foo = 5;
那为什么叫函数expression?:
const bar = function() {
// Some code
};
第二个例子,不是声明了“const bar”吗?为什么函数表达式和函数声明是这样命名的?为什么函数表达式不称为函数声明,反之亦然?
Then why is this called a function expression?:
给一个变量赋值,其实就是一个表达式。在您的示例 foo = 5
中,这是一个表达式。您还声明了 foo
,但它仍然是一个表达式。
类似地,另一个例子const bar = function() {}
被称为函数表达式以区分函数声明和函数表达式。
函数表达式
const bar = function() {
// Some code
};
与函数声明
function foo() {
// Some code
};
有趣的问题。措辞可以有软边界,这在一定程度上是造成这种混淆的原因。
首先,一些粗略的定义:
- 表达式:我认为这是最好的例子。
2 * 2
是一个表达式,因为你可以继续对它进行其他操作,比如2 * 2 - 3
。另一方面,if (...)
不是 javascript 中的表达式,它不会解析为您可以对其进行进一步操作的值。做if (...) {...} / 2
是无效的。这个“定义”有一些漏洞,但对于这个答案来说应该足够好了。 - 声明: 声明就是声明你要使用某个变量名。因此,在您使用
const foo = 5
的示例中,实际声明的是const foo
部分,= 5
只是初始化声明。
考虑到这一点,让我们考虑两个函数示例,看看这个术语在这些示例中的作用:
const g = function() {}
这里有一个声明,const g
。我们还看到正在创建一个函数并将其分配给 g。我们正在用 function() {}
的结果做某事(我们将它分配给某物),这意味着 javascript 会将其解释为函数表达式。
function f() {}
我们没有将这个函数用作表达式(在创建它之后我们没有对它进行任何额外的操作),所以 javascript 实际上将把它与我们的第一个例子不同。它将在本地命名空间中声明 f,并将应用 function hoisting。如果您只是在 function f() {}
之前添加一个 +
,那么您将导致 javascript 将其解释为表达式,并且这些功能将被禁用。您可以在开发工具中尝试 - 输入 +function f(){}
或 const g = function f(){}
,f 将保持未定义状态。
javascript 在不同上下文中以不同方式对待 function 关键字这一事实是这种语言选择的核心。您几乎可以认为“function”关键字具有两种不同的含义,所选择的含义取决于上下文。任何时候在表达式上下文中使用函数或未命名函数时,它都采用“表达式”形式,我们称其为“函数表达式”。否则,它采用包含一些额外功能的替代形式,例如将函数名称声明为局部变量。这可能就是我们采用将这种替代形式称为函数声明的原因。但是,就像 OP 正确指出的那样,即使使用 const f = function() {}
,声明仍在进行,只是 function
关键字没有发生。
脚注:对于像 +function f() {}
这样的示例,f 不会在与 g 相同的范围内定义,但它 确实 在 f 的主体内定义。换句话说,任何命名函数表达式 声明 它的名字在它自己的体内。