请解释这个javascript函数的定义和它们的最佳用途(模块模式)

Please explan this javascript function definition and their best use (Module Pattern)

本文关键字:最佳 模式 模块 解释 javascript 函数 定义      更新时间:2023-09-26

下面是什么类型的函数,哪些是它们的最佳用途?

var f = function (){
    var a = 0;
    return {
        f1 : function(){
        },
        f2 : function(param){
        }
    };
}();

我试图将其转换为:

var f = {
    a : 0,
    f1: function (){
    },
    f2: function (param){
    }
}

但是似乎不一样

这只是一个立即调用的普通旧函数,并返回一个对象,然后由f引用。

被返回对象引用的函数保留了引用a变量的能力。

立即调用的函数之外的代码不能引用a,所以它享受一些保护,因为您可以通过导出的函数精确地控制a发生的事情。

此模式有时称为模块模式


关于您更新的问题,它不一样,因为a现在是对象的公开可用的属性

对于引用它的函数,它们将做:

f.a;

或者如果函数将从f对象调用,他们可以这样做:

this.a;

:

var f = {
    a : 0,
    f1: function (){
        alert( this.a );
    },
    f2: function (param){
        this.a = param;
    }
}
f.f2( 123 );
f.f1(); // alerts 123

但关键是a是公开可用的。任何可以访问f的代码都可以访问f.a,因此无需使用f1f2函数即可对其进行更改。

这就是第一段代码的美妙之处。您可以精确地控制a

基本上创建了一个"类" - JS没有类,所以一个类基本上是一个函数,比如你的函数f

你发布的代码的有趣之处在于它创建了一个私有变量a和两个公共函数f1f2。它们是公共的,因为构造函数——外部函数——返回它们。

这是组织和封装JS代码的常用模式。

你可以在这里阅读更多信息

创建并返回对象是一个简单的函数。它立即执行,其结果保存到变量f

首先声明一个局部(或私有)变量a,该变量仅在函数的作用域中可见。然后,它构造一个对象,该对象具有成员f1f2,这两个成员都是函数。由于该返回对象是在声明a的同一作用域中声明的,因此f1和f2都可以访问a。

您的转换只是创建一个对象。以前的函数可以创建无数个对象,而现在只有一个对象,仅此而已。我不确定为什么它不起作用,但一个主要的区别是a现在对世界是可见的,在此之前它是私有的返回对象。