使用和不使用闭包创建私有变量

Creating Private Variables with and without Closures

最近一直在努力学习JavaScript中的私有变量和闭包。我刚刚了解了 IIFE 以及它们如何与闭包一起使用来创建“私有”变量和函数。下面是我理解的一个例子。

let test = (function() {
  
  let name = "";
  
  let getName = function() {
    return name;
  }
  
  let setName = function(newName) {
    name = newName;
  }
  
  return {
    getName: getName,
    setName: setName
  };
  
})();

test.setName("Bob");
test.getName(); // "Bob"
test.name; // undefined

然而,这让我想知道,为什么我不能用一个正则函数表达式来完成这个,然后调用该表达式,然后将它保存到一个变量中。这个新变量也将有一个私有名称值。例如:

let test2 = function() {
  
  let name = "";
  
  let getName = function() {
    return name;
  }
  
  let setName = function(newName) {
    name = newName;
  }
  
  return {
    getName: getName,
    setName: setName
  };
  
}

let test3 = test2();

test3.setName("Bob");
test3.getName(); // "Bob"
test3.name; // undefined

IIFE 方法与定义后立即调用的正则函数表达式相比有什么好处吗?

谢谢!

好处是 IIFE 只是一个表达式。没有对封闭的命名空间进行任何更改(好吧,至少不是由 IIFE 本身直接进行)。当您需要一个作用域来完成某些工作,但您所处的上下文只允许一个表达式时,它很有用。 IIFE 可以是任何东西,也许是一个完整的程序,但它 returns 封闭上下文的单个值(例如对象初始化器)。

这两个代码是等价的,但是第二个版本创建了一个不必要的全局变量test2(假设这是顶级代码)。

IIFE 有点像顶级版本的匿名函数 -- 当您只需要在一个地方使用代码时使用它们,因此不需要给它一个永久的名称。