提问人:Urooj 提问时间:9/19/2023 最后编辑:InSyncUrooj 更新时间:9/25/2023 访问量:128
为什么函数声明作为 If 语句的主体不会导致 JavaScript 中的错误?
Why doesn't function declaration as body of If statement result in an error in JavaScript?
问:
在 MDN 文档的“语句和声明”中提到:
术语“语句”和“声明”在 JavaScript 的正式语法中具有精确的含义,这会影响它们在代码中的放置位置。例如,在大多数控制流结构中,正文只接受语句,例如if...还。如果使用声明而不是语句,则会是 SyntaxError。例如,let 声明不是语句,因此不能将其裸露形式用作 if 语句的主体。
以下代码将给出错误:
if(true)
let x = 0;
现在函数声明也只是声明,对吧?那么为什么下面的代码没有给出同样的错误呢?
if(true)
function foo() {}
答:
因为使用 function 关键字声明函数会将其置于全局范围内。
做一个简单的测试:
if (true) {
function foo(x) { return x+2 }
}
console.log(foo(5))
将导致控制台中的“7”,证明该函数实际上是在 if 之外定义的。
相反,在 if 中显式定义的变量将限定为 if。
请注意,此代码将引发错误,因为 bar 不会在 if 之外定义。
if (true) {
const bar = function (x) { return x+2 }
}
console.log(bar(5))
评论
已知几种广泛使用的 ECMAScript 实现支持将 FunctionDeclaration 用作语句。但是,在应用于此类 FunctionDeclaration 的语义中,实现之间存在显着且不可调和的差异。由于这些不可调和的差异,使用 FunctionDeclaration 作为语句会导致代码在实现之间无法可靠地移植。建议 ECMAScript 实现禁止 FunctionDeclaration 的这种用法,或者在遇到此类用法时发出警告。ECMAScript 的未来版本可能会定义用于在 Statement 上下文中声明函数的替代可移植方法。
从下一版到当前版,第二个结构由附录 B 中指定的附加功能覆盖,当主机是 Web 浏览器时,这是必需的:
IfStatement[Yield, Await, Return]:
if
(
表达式[+In, ?屈服?等待] FunctionDeclaration[?屈服?等待,~默认])
评论
+function bar() {}; bar();
bar
function foo() {}