Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用纯/本机JavaScript正确嵌套函数?_Javascript_Payment - Fatal编程技术网

如何使用纯/本机JavaScript正确嵌套函数?

如何使用纯/本机JavaScript正确嵌套函数?,javascript,payment,Javascript,Payment,如何使用纯/本地JavaScript正确嵌套函数并在等式中的某个位置调用函数pmt?因为当我测试我的脚本时。结果未显示。很抱歉我是JavaScript新手。多谢各位 我想首先计算支付函数pmt,并将其调用到我的实际方程中 CEIL(PMT(fieldname1-fieldname2 / (1- (1 / (1 + interest/12)*exp(fieldname22))) / interest/ 12)); 下面是我的脚本: //fieldname22 = radio button wi

如何使用纯/本地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));
 })()

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

当前代码中有两个隐藏的错误是不可见的,因为您一次在屏幕上抛出了太多的数字

首先,IIFE会立即运行,它们会传递结果,但你必须捕获它们,因为无法再次调用它们

var result = (function () {
    /* ...do stuff */
    return stuff;
}());
如果前面没有var,那么返回值就会被抛出。 不太好

其次,将大量数学知识作为参数传递到PMT函数中

return CEIL(PMT(/*.... lots of stuff */));
这很好,但是您的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 ) + , )
好消息是有很多方法可以改进和简化

我建议的第一件事是摆脱生活;不要将该代码包装到立即启动的函数中,除非它只运行一次,并且它具有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电话里吗?你打算通过什么途径

我的期望是大多数幻数应该消失,并被预先计算的值或函数所取代

年摊销额、利息

然后你需要一个支付函数,它实际上接受参数并处理它们


我不能全部重写,因为我没有全部的作品;有些是缺失的,有些是我得到的魔法数字,但其他的部分我无法理解,弄清楚你打算怎么做以及为什么要做的事情对我来说是迷失的,就像在PMT里面做数学一样。。。这将永远不会被看到,然后在函数内部做更多的数学运算,这确实会被使用,并传递出去…

javascript名称区分大小写。使用PMT。。。调用您的函数。@Martin Ernst Ok。我现在就换。我如何调用等式中的PMT函数?为什么在PMT函数中设置PMT=呢?只需将方程分配给变量,如var result=然后返回该结果。之后,您可以使用PMTA位更改过多的console.log或赋值给该函数。在函数PMT中,您应该编写var PMT=。。。并返回pmt;。第二个问题:CEIL是您在其他地方定义的另一个函数还是Math.CEIL?它已经在我当前使用的插件中定义。如何将pmt的结果合并到公式中?我正在wordpress插件中使用该脚本,名为计算字段表单。插件的一位作者说,像这样启动我的函数{var interest=0;如果5000,我如何计算PMT?这样我就可以把它调用到方程中?暂时忘记这一点。答案保存到哪里了?当你按照作者所说的去做时,答案就没有了,除非你把它保存到一个变量:var answer=function{};您将答案放在哪里?答案将自动显示在表单中已存在的计算字段文本框中