为什么函数表达式不包含在执行上下文的变量对象中?

Why are function expressions not included in the variable object of the Execution Context?

在阅读 Dmitry Soshnikov 的 Execution Context part of the JavaScript.The Core. (1st ed.) 时,我遇到了这一行,它明确表示函数表达式不包含在执行上下文的变量对象 属性 中。

A variable object is a container of data associated with the execution context. It’s a special object that stores variables and function declarations defined in the context.

Notice, that function expressions (in contrast with function declarations) are not included in the variable object.

我知道将执行上下文表示为对象是一个抽象概念,具体情况可能因情况而异,但我仍然很想知道为什么作者明确表示不包括函数表达式.

AFAIK,函数表达式被 JavaScript 引擎视为任何其他变量,我看不出为什么它们应该从 variable 个对象。

Edit1:根据 ,我关于函数表达式被 JS 引擎视为 普通 变量的概念(如上段所述)是错误的。但是,问题仍然存在。

AFAIK, function expressions are treated as any other variables by JavaScript engines

他们不是。

函数表达式的计算结果为 value,这是一个 function。与函数声明不同,它们不会创建变量作为副作用。

声明

function bar () { };

这将创建一个名为 bar 的函数(即内部名称为 bar)并将其存储在名为 bar 的变量中。

表达式

const foo = function bar() { };

此处const foo创建一个名为foo的变量。

函数表达式创建一个名为 bar 的函数(同样是内部名称)并将其分配给 foo

没有创建变量 bar

IIFE

(function bar() { })();

这个立即调用的函数表达式创建了一个名为 bar 的函数并调用它。没有变量 bar。该函数未存储在任何地方。


请注意,我说的是上面定义的函数的分数。在函数声明和表达式中,事情变得有点复杂。

仔细阅读后,我意识到作者一直在使用术语“函数表达式”来表示我们通常所说的 IIFE and general function expression

In another article,作者说明保存到变量中的函数表达式,其实是包含在变量对象中的。不包括的是 IIFE,这是有道理的。

所以,综上所述,函数表达式确实包含在给定执行上下文的变量对象中,而 IIFE 则不是。

I am interested to know why the author explicitly says that functions expressions are not to be included.

我们不知道,你得问作者:-)

如果我写下这个定义,我什至会完全忽略函数:

"变量对象是与执行上下文关联的数据容器。它是一种特殊对象,用于存储在上下文中定义的变量"

然后可以澄清一下

"变量由变量声明、函数声明和函数参数定义。没有其他内容创建变量。"

当然,您还必须了解有一个 difference between a function declarations and function expressions,并且它取决于两个 function 关键字中的哪一个创建的词法上下文。然而,我希望在有关解析和表达式评估的部分中,而不是在变量对象的讨论中。