以下代码演示了一个立即调用的函数表达式,用作解构赋值表达式中默认值的右侧值。
const { foo = (function bar() { return 'bam'; }()) } = {};
在表达式之外看不到函数表达式bar
。
这是否意味着JavaScript具有表达范围?
如果是这样,这是否意味着表达式有自己的概念LexicalEnvironment
?
答案 0 :(得分:2)
函数表达式bar
不可见,因为它是函数表达式,即使是命名的表达式。它不会在符号表中为该函数创建任何符号。
function bar() {}
这是一个创建符号bar
的函数声明。
(function bar() {});
这是一个函数表达式,不会产生任何结果。它是一个命名的函数表达式,所以你会看到一个函数名称在堆栈跟踪中弹出,函数可以通过名称引用它自己,但它不是一个函数声明。
答案 1 :(得分:0)
是的,是的。
official spec for JavaScript甚至还有一节讨论词汇环境。
在较高的层次上,基本上任何闭包或块都将定义一个新的范围,其中的功能在它们之外是不可用的。这用于帮助提供范围并执行模拟“私有”变量等操作。