javascript - 请解释一下这个 javascript 函数的定义及其最佳用途(模块模式)

标签 javascript function object

以下是什么类型的函数以及它们的最佳用途是什么?

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 发生的情况。

关于javascript - 请解释一下这个 javascript 函数的定义及其最佳用途(模块模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8305117/

相关文章:

javascript - 如何使用 Ruby 验证 webhook? (在 rails 中)

list - 在 Common Lisp 的 2 个列表中递归应用函数

mysql - 删除 MySQL 中的非字母数字

javascript - 通过对象的属性之一查找对象的名称

java - 实例化新对象与实现 reset() 方法

javascript - 无法绑定(bind)到 '(ngModel',因为它不是 Angular 单元测试用例中 'input' 的已知属性

javascript - AJAX 发送带有函数的对象会在函数中引发错误

javascript - 单击和链接时的 jQuery 事件

c++ - 返回一个指向你作为函数参数的 char * 的指针是否合乎逻辑?

Javascript - 从子对象调用第一级对象