如何使用纯/本机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));
})()
答案 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(...)
里面做数学一样永远不会看到了,然后在函数内部进行了更多的数学运算(确实得到了使用),并传递出来......