如何使用纯/本机JavaScript正确嵌套函数?
如何使用纯/本地JavaScript正确嵌套函数并在等式中的某个位置调用函数pmt?因为当我测试我的脚本时。结果未显示。很抱歉我是JavaScript新手。多谢各位 我想首先计算支付函数pmt,并将其调用到我的实际方程中如何使用纯/本机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
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{};您将答案放在哪里?答案将自动显示在表单中已存在的计算字段文本框中