【问题标题】:javascript module creation and initializationjavascript模块创建和初始化
【发布时间】:2016-08-12 20:29:20
【问题描述】:

我的 js 是这样做的:

var MyClass ={
        a: 1,
        b: 2,
        init: function(message){ console.log("calling c to say "+message);};
 };

 MyClass.init("hello");

//以上代码都在js文件中

我一直在看到 IIFE 模式,但与上面相比,我恐怕看不出它给我带来了什么好处。 我有一个模块 MyClass 并能够在其上调用方法。使用这种模式有缺点吗?

【问题讨论】:

  • 缺点是它是一个普通对象,你没有闭包提供的封装。
  • 您能详细说明一下吗?我了解以下答案中发生的事情,但这与我的模块创建无关。答案只是执行一个函数和一些代码。没有创建模块或封装。你是说在我的对象中我可以访问 MyClass.a 和 MyClass.b 等,但是如果我使用 IIFE,将能够控制它吗?如果我必须将其重写为 IIFE,我会怎么做?谢谢我是js新手
  • 当然有封装——你无法到达x,因为它在闭包内。答案不会创建模块,而是因为其目的是展示您的解决方案将缺少什么,而不是因为它显示“如何制作模块”。鉴于您声称您已经知道这一点,因此再次回顾它是多余的。
  • 当我声称能够制作一个模块时,我指的是上面的 MyClass 代码。如果我不需要像 x 这样的私有变量,我制作“模块”的方式就足够了吗?如果不能,请告诉我如何使用 IIFE?我要仔细看一下才能理解
  • 几周前我写过an answer,虽然很冗长,但我认为它应该能回答你的问题。随时查看其中的链接以获取有关该主题的更多信息 - 最值得注意的是closures(也显示为与此问题相关)以及我对模块模式的不同看法的链接。

标签: javascript iife


【解决方案1】:

IIFE 用于创建新的函数作用域,以避免将变量泄漏到全局作用域中:

(function() {
    var x = 1;
    console.log(x); // 1
})();

console.log(x);     // undefined

这基本上与调用存储在您的示例中的对象中的函数无关。

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 2021-09-04
    • 2016-07-06
    • 1970-01-01
    • 2017-03-16
    • 2018-08-29
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多