【问题标题】:Creating Private Variables with and without Closures创建带闭包和不带闭包的私有变量
【发布时间】:2021-09-22 15:32:10
【问题描述】:

最近,我一直在尝试学习 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 没有什么神奇之处。
  • 唯一的区别是函数的调用是直接内联的,不能再次调用该函数。与您的正常函数声明相比,这是一次性的。

标签: javascript closures iife


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    IIFE 有点像匿名函数的顶级版本——当你只需要在一个地方的代码时使用它们,所以没有必要给它一个永久的名字。

    【讨论】:

    • 所以const foo = function() {const bar = function() {}}, bar 是全局定义的?
    • 否,但foo 是全局定义的。
    • “可能创建”不是更合适,因为没有引用范围并且全局是一个假设?
    • 没错,我认为问题是关于顶级代码的。这是使用 IIFE 最常见的地方。
    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多