如何使用纯/本机JavaScript执行正确的嵌套功能?

时间:2014-09-25 09:10:09

标签: javascript payment

如何使用纯/本机JavaScript在等式中的某个位置执行右嵌套函数并调用函数(pmt)?因为当我测试我的脚本时。结果未显示。抱歉。我是JavaScript的新手。谢谢

我想首先计算支付函数(pmt)并将其调用到我的实数等式

CEIL(PMT(fieldname1-fieldname2 / (1- (1 / (1 + interest/12)*exp(fieldname22))) / interest/ 12));

这是我的剧本:

 //fieldname22 = radio button with no. of terms
 //fieldname1 = amount
 //fieldname2 = downpayment

 (function() {
     var interest = 0;
     if (5000<=fieldname1 && fieldname1<=12000) {
         if(fieldname22 == 9) interest=0.994;
         else if(fieldname22 == 12) interest=0.9351;
         else interest=0.994;
     }
     if (12001<=fieldname1 && fieldname1<=30000) {
         if(fieldname22 == 9) interest=0.9383;
         else if(fieldname22 == 12) interest=0.917;
         else if(fieldname22 == 15) interest=0.8607;
         else interest=0.9351;
     }
     if (30001<=fieldname1 && fieldname1<=60000) {
         if(fieldname22 == 9) interest=0.9383;
         else if(fieldname22 == 12) interest=0.8988;
         else if(fieldname22 == 15) interest=0.8429;
         else if(fieldname22 == 15) interest=0.7901;
         else interest=0.9383;
     }

     function PMT () {
         return (fieldname22 * (fieldname1-fieldname2 * Math.pow((fieldname22+1),fieldname22))) / ((interest+1) * Math.pow((interest+1),fieldname22));
     }

     return CEIL(PMT(fieldname1-fieldname2 / (1-(1/(1+(interest/12))*EXP(fieldname22))) / interest/12));
 })()

1 个答案:

答案 0 :(得分:0)

我建议的第一件事就是重构整段代码。

当前代码中有两个隐藏的错误,但这些错误并不可见,因为您一次在屏幕上抛出这么多数字。

第一个是,IIFE立即运行,他们通过结果,但你必须抓住它们,因为没有办法再次调用它们。

var result = (function () {
    /* ...do stuff */
    return stuff;
}());

如果你前面没有变量,那么返回值就会被抛弃。
不好。

其次,您将很多的数学作为参数传递给PMT函数。

这很棒,但你的PMT函数实际上并不接受论证。

return CEIL(PMT(/*.... lots of stuff */));

...但

function PMT () { /* no argument */
    /* do more stuff */
}

更糟糕的是,PMT实际上包含了破损的JS,现在 当你调用它时会抛出一个错误,因为这篇文章:

// + nothing, and then no second argument; two reasons to throw errors, back to back
( fieldname1-fieldname2 * Math.pow ( (fieldname22+1), fieldname22 ) + , )

好消息是,有很多方法可以改进和简化。

我建议的第一件事就是摆脱IIFE;不要将该代码包装在一个立即触发的函数中,除非它只运行一次,并且它有0个依赖项,并且它需要在之前运行其他任何事情都可能发生(除了其他事情)有0个依赖项,需要在其他东西之前运行)。

相反,请将其包装在您可以根据需要调用多次的函数中。

function calculate (amount, downpayment, periods) {
    /* all of your stuff */
    return CEIL(PMT(/*...*/));
}


function showTotal () {
    var total = calculate(fieldname1, fieldname2, fieldname22);
    console.log("CURRENT TOTAL: ", total);
};


document.querySelector("#calculateTotal").onclick = showTotal;

现在抓住价值并使用它应该更容易。

利息表有点混乱;确定存在一些逻辑层次,但现在它们的编写方式会使它们变得难以维护。

事实上,那里已经存在一条规则,你可以给出相同的15个周期两个不同的费率。 这很难看,因为它堆得那么高。

var interestLevels = [0, 5000, 12001, 30001, 60000],
    interestBrackets = [
        { default : 0     },
        { default : 0.994,  "12" : 0.9351 },
        { default : 0.9351,  "9" : 0.9383, "12" : 0.917, "15" : 0.8607 },
        { default : 0.9383, "12" : 0.8988, "15" : 0.8429 }
    ];

function getInterestBracket (amount) {
    var bracketLevel = interestLevels.filter(function (level) {
         return level < amount;
    }).length - 1;

    return interestBrackets[bracketLevel];
}

function getInterestAmount (bracket, numPeriods) {
    return bracket[numPeriods] || bracket.default;
}

function getInterest (amount, numPeriods) {
    var bracket  = getInterestBracket(amount),
        interest = getInterestAmount(bracket, numPeriods);

    return interest;
}


var interest = getInterest(amount, numPeriods);

它并不完美,但它应该 更容易看到你正在做什么,并且更容易维护。

至于付款,你需要弄清楚你在哪里做数学;它会在PMT电话里面吗?你打算怎么做?

我的期望是大多数魔法数字应该消失,并用预先计算的值或函数替换。

annualAmortization(amount, interest)

然后你需要一个支付功能,实际上接受参数并用它们做事。

我无法重写所有内容,因为我没有全部内容;有些是遗失的,有些是神奇的数字,我得到的碎片,但其他碎片躲避我,并弄清楚你打算如何以及为什么要做的事情在我身上丢失(就像在PMT(...)里面做数学一样永远不会看到了,然后在函数内部进行了更多的数学运算(确实得到了使用),并传递出来......