首页 > 解决方案 > 创建带闭包和不带闭包的私有变量

问题描述

最近,我一直在尝试学习 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 方法与我在定义它后立即调用的正则函数表达式相比有什么好处吗?

谢谢!

标签: javascriptclosuresiife

解决方案


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


推荐阅读