我正在阅读Kyle Simpson撰写你不了解JS 的范围和关闭标题,特别是这个主题Compiler Speak。本节介绍引擎使用的Lookup类型。现在我理解LHS或RHS查找的内容在本节给出的范围内。
我的问题是说明function fx(a) {..
形式的函数声明不是LHS查找。有相同的解释,但我无法理解。这是整个笔记
您可能想将函数声明函数
foo(a) {...
概念化为常规变量声明和赋值,例如var foo
和foo = function(a){...
。在这样做时,将这个函数声明视为涉及LHS查找是很诱人的。但是,微妙但重要的区别在于编译器在代码生成期间处理声明和值定义,这样当Engine执行代码时,没有必要将函数值“赋值”给foo
。因此,将函数声明视为我们在此讨论它们的方式中的LHS查找分配并不合适。
任何形式的澄清都会有所帮助。甚至在LHS和RHS查找上也是如此。
答案 0 :(得分:1)
“查找”主题与表达式评估有关。函数声明语句
function someName() {
// code
}
不表达式。它是一种独特的语句类型,与return
是一种独特的语句类型,while
和if
的方式相同。除了要绑定到本地范围中的函数名称的新函数对象的隐式实例化之外,函数声明语句中不会发生表达式求值。
LHS和RHS值的主题(通常,根据我的经验,在文献中称为 l-values 和 r-values )很重要,但它只是有与函数声明无关。
答案 1 :(得分:0)
我在阅读时分享了相同的问题。上面Pointy的回答使这个概念很清楚,我只是使用该书较新版本的引文添加更多的解释:
“ function getStudentName(studentID) {
函数声明是目标引用的特例。您可以认为它类似于var getStudentName = function(studentID),但这并不完全准确。声明了一个getStudentName标识符(在编译时),但是= function(studentID)部分也在编译时进行了处理;在范围的开头会自动设置getStudentName和函数之间的关联,而不是等待=赋值语句执行。
注意: 这种功能和变量的自动关联称为“功能提升”,将在第5章中详细介绍。”