JavaScript中(function() { } )() 是什么?

JavaScript 的(function() { } )()结构初看起来可能令人困惑,但对于编写即时执行且自成一体的代码块来说,它却是一个非常有用的工具。

虽然 (function() { } )() 看起来像是大括号和小括号的奇怪组合,但它在 JavaScript 中却有特定的功能。

JavaScript 中的构造(function() { })()称为立即调用函数表达式 (IIFE)。它是一种同时定义和执行函数的方法。使用 IIFE 的主要目的是为变量创建新的作用域,防止它们污染全局作用域。

通过将代码封装在 IIFE 中,可以避免污染全局命名空间,并在需要时准确运行代码。通过使用 IIFE,我们可以编写更有条理、更模块化的 JavaScript 代码。

(function() {
  // 您的代码在此
  var x = 10;
  console.log(x);
})();

说明:
(function() { } )() 

该表达式是立即调用的函数表达式。它包括两个部分,注意有两对括号:

  • 函数声明:(function() {})定义了一个匿名函数,这第一组括号中的 function() { } 是匿名函数表达式,用()括号将 function() {}括起来,就是将一个表达式括起来,表示局部作用域,局限在这对括号的上下文 限制里, function() {}涉及的任何变量都被限制在当前这对括号上下文,不会进入全局作用域上下文场景中,避免全局变量名冲突。
  • () 会立即调用函数:函数表达式由最后一对括号()表示立即调用或调用,这对括号在第一组括号之外。


此模式的变体,例如将参数传递给 IIFE:

(function(x, y) {
  var result = x + y;
  console.log(result);
})(5, 7);

在这种情况下,5和7作为参数传递给 IIFE,并且该函数将立即使用这些值执行。

作用域限制

(function () {
    let counter = 0;
    function increaseCounter() {
        counter++;
    }
    increaseCounter();
    console.log(counter);
})();


该表达式创建了一个局部作用域,防止计数器变量counter 污染全局作用域。这种封装是有益的,尤其是在避免全局变量冲突至关重要的大型应用程序中。

又一个示例

let Module = (function () {
    let privateVariable = "I am private.";

    function privateFunction() {
        console.log(
"This is a private function.");
    }

    return {
        publicVariable:
"I am public.",
        publicFunction: function () {
            console.log(
"This is a public function.");
        }
    };
})();

console.log(Module.publicVariable);
Module.publicFunction();
console.log(Module.privateVariable);
// Module.privateFunction();
// Error: Module.privateFunction is not a function


在这里,IIFE 被用来创建一个具有私有和公有成员的模块。私有成员(privateVariable 和 privateFunction)封装在 IIFE 中,模块外部无法访问。返回的对象只包含公共成员。

总之
IIFE用来实现封装、内聚以及划定上下文边界都有很大作用。