高级JavaScript:为什么这个函数用圆括号封装?

在 JavaScript 中,我们经常会看到一个函数被用圆括号封装起来。例如:

----------- -
  -- ----
-----

这种写法被称为立即执行函数表达式(Immediately Invoked Function Expression,IIFE)。那么为什么要使用 IIFE 呢?本文将深入探讨这个问题。

作用域

JavaScript 的作用域是基于函数的。也就是说,每个函数都会创建一个新的作用域,其中声明的变量只在该函数内可见。

但是,在某些情况下,我们可能希望创建一个临时的作用域,以避免变量名冲突或者泄露到全局作用域中。这时候,我们可以使用 IIFE 来创建一个新的作用域。

例如,考虑以下代码:

--- - - ---

-------- ----- -
  --- - - ---
  ---------------
-

------ -- -- --
--------------- -- -- --

在上面的代码中,foo() 函数内部声明了一个变量 x,它的值为 20。但是,全局作用域中也有一个变量 x,它的值为 10。因此,当我们调用 foo() 函数时,它会输出 20,但是在函数外部调用 console.log(x) 时,它会输出 10。

如果我们想要避免这种情况,可以使用 IIFE 来创建一个临时的作用域。例如:

--- - - ---

----------- -
  --- - - ---
  ---------------
-----

--------------- -- -- --

在上面的代码中,console.log(x) 输出了 20,因为它是在 IIFE 的作用域内执行的。而在函数外部调用 console.log(x) 时,它仍然会输出 10。

封装

除了创建临时作用域之外,IIFE 还可以用来封装代码。例如,假设我们有一个变量 x,我们希望将它隐藏起来,以便其他人无法访问它。我们可以使用 IIFE 来实现这个目的。

--- ------- - ----------- -
  --- - - --

  ------ -
    ---------- ---------- -
      ----
    --
    --------- ---------- -
      ------ --
    -
  --
-----

--------------------
-------------------------------- -- -- -

在上面的代码中,我们创建了一个计数器对象,它包含两个方法:increment()getValue()。这些方法都是在 IIFE 的作用域内定义的,并且可以访问该作用域中声明的变量 x。同时,我们将计数器对象赋值给变量 counter,从而使其对外可见。

由于变量 x 是在 IIFE 的作用域中声明的,因此其他人无法直接访问它。只有通过调用 increment()getValue() 方法才能改变和获取计数器的值。

总结

通过使用 IIFE,我们可以创建临时作用域,以避免变量名冲突或泄露到全局作用域中。同时,我们还可以使用 IIFE 封装代码,以实现信息隐藏和封装性。

虽然 IIFE 看起来有些复杂,但是它们是 JavaScript 中非常有用的概念。如果您想要进一步提高您的 JavaScript 技能,那么学习如何使用 IIFE 是一个很好的起点。

示例代码:

--- - - ---

----------- -
  --- - - ---
  -------------

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------