是否可以将每个包含相似代码的函数分解?

时间:2016-08-11 14:02:24

标签: javascript jquery

我有两个Javascript函数,它们都使用jquery-confirm(https://craftpip.github.io/jquery-confirm/)并包含非常相似的代码:

function cnf(cntn, fn) {
    $.confirm({
        title: "",
        content: cntn,
        confirmButton: "Yes",
        cancelButton: "No",
        confirm: function() { fn(); },
        cancel: function() { }
    });
}
function cnfprm(cntn, fn, prm) {
    $.confirm({
        title: "",
        content: cntn,
        confirmButton: "Yes",
        cancelButton: "No",
        confirm: function() { fn(prm); },
        cancel: function() { }
    });
}

我想知道是否可以通过创建另一个封装这两个调用的相似性的函数来对此代码进行分解,因此得到的代码类似于:

function cnf(cntn, fn) {
    subfn(cntn, confirm: function() { fn(); });
}
function cnfprm(cntn, fn, prm) {
    subfn(cntn, confirm: function() { fn(prm); });
}

...或者是否有另一种方法来分解代码?

3 个答案:

答案 0 :(得分:4)

只需使用这一功能:

function cnf( cntn, fn, optionalPrm ) {
    $.confirm({
        title: "",
        content: cntn,
        confirmButton: "Yes",
        cancelButton: "No",
        confirm: function() { fn( optionalPrm ); },
        cancel: function() { }
    });
}

当您不需要时,请optionalPrm为空。由于它将是未定义的,因此您的函数可能已经忽略它无论如何。由于前两个参数是相同的,因此没有区别。如果第三个参数存在,那么很好,否则它将好像它无论如何都不存在。

答案 1 :(得分:1)

我认为你可以使用它:

function cnf(cntn, fn){
  cnfprm(cntn, fn);
}

function cnfprm(cntn, fn, prm) {
  $.confirm({
    title: "",
    content: cntn,
    confirmButton: "Yes",
    cancelButton: "No",
    confirm: function() {
      if(prm !== undefined){ fn(prm); }else{ fn(); }
    },
    cancel: function() { }
  });
}

答案 2 :(得分:0)

我同意这个基本想法,但如果第三个不在那里,我会尽量避免传递参数:

function cnf( cntn, fn, optionalPrm ) {
    var fnparams = [];
    for (var i = 2; i < arguments.length; ++i)
      fnparams.push(arguments[i]);

    $.confirm({
        title: "",
        content: cntn,
        confirmButton: "Yes",
        cancelButton: "No",
        confirm: function() { fn.apply(undefined, fnparams ); },
        cancel: function() { }
    });
}

(基于&#34;答案中的代码&#34;)