Javascript中形式为`function fx(){}`的函数声明是LHS还是RHS查找?

Javascript中形式为`function fx(){}`的函数声明是LHS还是RHS查找?,javascript,javascript-engine,Javascript,Javascript Engine,我正在阅读Kyle Simpson的《你不知道JS》的《范围和闭包》,特别是这个主题。本节介绍引擎使用的查找类型。现在我了解了本节给出的LHS或RHS查找范围 我的问题是注释中说函数声明的形式function fx(a){..不是LHS查找。对此有一个解释,但我无法理解。这是整个注释 您可能会试图将函数声明函数foo(a){…概念化为普通变量声明和赋值,例如var foo和foo=function(a){…。在这样做时,很容易将此函数声明视为涉及LHS查找。然而,微妙但重要的区别在于编译器在代码

我正在阅读Kyle Simpson的《你不知道JS》的《范围和闭包》,特别是这个主题。本节介绍引擎使用的查找类型。现在我了解了本节给出的LHS或RHS查找范围

我的问题是注释中说函数声明的形式
function fx(a){..
不是LHS查找。对此有一个解释,但我无法理解。这是整个注释

您可能会试图将函数声明函数
foo(a){…
概念化为普通变量声明和赋值,例如
var foo
foo=function(a){…
。在这样做时,很容易将此函数声明视为涉及LHS查找。然而,微妙但重要的区别在于编译器在代码生成过程中同时处理声明和值定义,因此当引擎执行代码时,不必进行“赋值”处理将函数值设置为
foo
。因此,按照我们在这里讨论的方式,将函数声明视为LHS查找赋值是不合适的

任何类型的澄清都会有帮助。即使是在LHS和RHS查找上。

查找”的主题与表达式求值有关。。函数声明语句

function someName() {
  // code
}
而不是一个表达式。它是一个不同的语句类型,与
return
是一个不同的语句类型相同,
while
if
是一个不同的语句类型。在函数声明语句中,除了隐式实例化要绑定到函数的新函数对象外,不会进行表达式求值本地范围中的名称


LHS和RHS值的主题(根据我的经验,通常在文献中称为l值和r值)是很重要的,但它与函数声明无关。

我在阅读时也提出了同样的问题。上面Pointy的回答让这个概念非常清楚,我只是引用了本书较新版本中的一段话来补充更多的解释:

函数getStudentName(studentID){

函数声明是目标引用的一种特殊情况。您可以将其视为类似于var getStudentName=function(studentID),但这并不完全准确。声明了标识符getStudentName(在编译时),但声明了=function(studentID)部分也在编译时处理;getStudentName和函数之间的关联在作用域的开头自动设置,而不是等待执行=赋值语句

注: 函数和变量的这种自动关联称为“函数提升”,在第5章中有详细介绍。”