首页 > web前端 > js教程 > 为什么 JavaScript 中的 `(function(){})();` 与 `function(){}();` 不同?

为什么 JavaScript 中的 `(function(){})();` 与 `function(){}();` 不同?

Linda Hamilton
发布: 2024-12-13 13:34:15
原创
420 人浏览过

Why Does `(function(){})();` Differ from `function(){}();` in JavaScript?

深入研究封装匿名函数的语法

在 JavaScript 中,封装匿名函数涉及将代码块括在括号内并立即执行它。这种语法对于防止全局范围污染和促进模块化脚本具有重要意义。然而,问题是为什么 (function(){})();与 function(){}(); 的行为截然不同。

函数声明与函数表达式

语法区别取决于函数是被解析为 FunctionDeclaration 还是一个函数表达式。关键区别在于是否存在名称标识符,这对于 FunctionDeclarations 是必需的。

遵循语法规则“function Identifier (FormalParameterListopt) {FunctionBody}”的 FunctionDeclarations 需要命名标识符。

封装匿名函数

相反,FunctionExpressions 由“function Identifieropt(FormalParameterListopt) {FunctionBody}”控制,允许可选命名。这使我们能够在括号内创建未命名的函数表达式:

(function () {
    alert(2 + 2);
}());
登录后复制

分组运算符的作用

用于封装匿名函数的括号起着至关重要的作用,分组运算符。它表示对表达式的求值,并且对 FunctionExpressions 进行求值。因此,用括号括住 FunctionDeclaration 会强制将其视为 FunctionExpression。

上下文理解

FunctionDeclarations 和 FunctionExpressions 的语法规则可能会导致歧义。解析器通过考虑函数出现的上下文来解决这个问题。函数声明通常出现在全局作用域或函数体内,而函数表达式可以出现在各种上下文中,包括块内。

潜在陷阱

在块内使用函数时可以提供封装,但由于不可预测的行为而不鼓励这样做。例如:

if (true) {
  function foo() {
    alert('true');
  }
} else {
  function foo() {
    alert('false!');
  }
}

foo(); // Outputs "true" with ambiguous behavior
登录后复制

以上是为什么 JavaScript 中的 `(function(){})();` 与 `function(){}();` 不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板