JavaScript 模块模式:用户可实现的功能

JavaScript Module Pattern: user implementable function

所以我使用模块模式来创建我自己的 'API' 以及私有和 public 方法和属性。到目前为止一切顺利。

但是:我想添加一个 public function/hook 可以由用户changed/implemented。

然而,问题是当从模块内部调用该函数时,它仍然知道先前的定义。我怎样才能确保使用覆盖的定义而不必在模块中使用变量名?

var test = (function(){
    'use strict';
    var version = "1.7.0";

    var a = function(){
        console && console.log("Test");
        defineC();
        c();
    };

    var _b = function(){
        a();
    };

    var c = function(){
        //User implementable
    };

    return {
        version: version,
        a: a,
        c: c
    };
})();

function defineC(){
    test.c = function(){
        console && console.log("My own function");
    };
}

test.a();

您需要将重写函数作为参数传递给 IIFE

像这样

var test = (function(userFunction){
   'use strict';
   var version = "1.7.0";

   var a = function(){
        console.log("Test");
        c();
   };

   var _b = function(){
        a();
   };

   var c = userFunction;

   return {
        version: version,
        a: a,
        c: c
   };
})(defineC);

function defineC(){
   console.log("My own function");
}

test.a();

https://jsbin.com/vuwenesehu/edit?js,console