Javascript 中的简单函数 NaN
Simple function NaN in Javascript
这是我的脚本:
function milesRun(){
var run1 = document.getElementById("runDist1").value;
var run2 = document.getElementById("runDist2").value;
var run3 = document.getElementById("runDist3").value;
var stepInches = document.getElementById("steplength").value;
var stepsRun = run1*1 + run2*1 + run3*1;
var milesRun = (stepsRun*1) * .0000157828 * (stepInches*1);
milesRun = milesRun.toFixed(2);
document.getElementById("milesIRun").innerHTML = milesRun;
}
function caloriesBurntMale(){
calories = milesRun*1 * 124;
calories = calories.toFixed(2);
document.getElementById("calsMen").innerHTML = calories;
}
function caloriesBurntFemale(){
calories = milesRun*1 * 105;
calories = calories.toFixed(2);
document.getElementById("calsWomen").innerHTML = calories;
}
我用 caloriesBurntFemale 函数和 caloriesBurntMale 函数返回 NaN。如何确保在这两个函数中得到的是数字而不是 NaN?
变量 milesRun
在函数 milesRun
中声明。因此函数 caloriesBurntMale
将无法访问它,因为在 js 中变量的作用域处于函数级别。
在这种情况下,您可以在函数外部声明变量,以便可以从其他函数访问它
var milesRun='';
function milesRun(){
//rest of the code
milesRun = (stepsRun*1) * .0000157828 * (stepInches*1).toFixed(2);
document.getElementById("milesIRun").innerHTML = milesRun;
}
function caloriesBurntMale(){
calories = milesRun*1 * 124;
}
有两个问题;一个是您的 'milesRun' 变量是在函数内部声明的(令人困惑的是,它也被命名为 'milesRun'),因此当其他函数尝试访问它时,它们将无法使用。
另一个是您尝试将字符串转换为数字 (foo*1
) 的方式,如果输入非数字,这仍将导致 NaN。
我倾向于使用这种技术,returns 如果可能的话,一个数字,或者零(如果输入不是数字):
Number(foo) || 0;
(等价的 shorthand 是 +foo || 0
,但读起来可能会造成混淆;我认为值得多敲几下键盘来让你清楚地知道你在输入一个数字。人们通常会建议改为 parseInt()
,如果你想要整数而不是数字,这很好(但不要忘记包括基数!)parseFloat()
是另一种选择;数字和之间有一些 differences parseFloat,这可能会根据您的需要使一个比另一个更合适。)
无论如何:题外话结束,这是一个使用该技术并将 milesRun 变量作为参数传递给其他函数的示例。我还重命名了 milesRun()
函数——严格来说这不是必需的,只要具有相同名称的变量始终包含在函数范围内,但重复名称肯定会引起混淆,因此最好避免它。
function milesRunFn() {
var run1 = Number(document.getElementById("runDist1").value) || 0;
var run2 = Number(document.getElementById("runDist2").value) || 0;
var run3 = Number(document.getElementById("runDist3").value) || 0;
var stepInches = Number(document.getElementById("steplength").value) || 0;
var stepsRun = run1 + run2 + run3;
var milesRun = stepsRun * .0000157828 * stepInches;
milesRun = milesRun.toFixed(2);
document.getElementById("milesIRun").innerHTML = milesRun;
caloriesBurntMale(milesRun);
caloriesBurntFemale(milesRun);
}
function caloriesBurntMale(milesRun){
calories = milesRun * 124;
calories = calories.toFixed(2);
document.getElementById("calsMen").innerHTML = calories;
}
function caloriesBurntFemale(milesRun){
calories = milesRun * 105;
calories = calories.toFixed(2);
document.getElementById("calsWomen").innerHTML = calories;
}
R1: <input id="runDist1"><br>
R2: <input id="runDist2"><br>
R3: <input id="runDist3"><br>
Step: <input id="steplength"><br>
<button onclick="milesRunFn()">Go</button><br>
Miles run:<span id="milesIRun"></span><br>
Women: <span id="calsWomen"></span><br>
Men: <span id="calsMen"></span><br>
(您也可以在全局范围内声明 var milesRun
,这样所有函数都可以访问它,但传递参数可能是更好的方法。)
这是我的脚本:
function milesRun(){
var run1 = document.getElementById("runDist1").value;
var run2 = document.getElementById("runDist2").value;
var run3 = document.getElementById("runDist3").value;
var stepInches = document.getElementById("steplength").value;
var stepsRun = run1*1 + run2*1 + run3*1;
var milesRun = (stepsRun*1) * .0000157828 * (stepInches*1);
milesRun = milesRun.toFixed(2);
document.getElementById("milesIRun").innerHTML = milesRun;
}
function caloriesBurntMale(){
calories = milesRun*1 * 124;
calories = calories.toFixed(2);
document.getElementById("calsMen").innerHTML = calories;
}
function caloriesBurntFemale(){
calories = milesRun*1 * 105;
calories = calories.toFixed(2);
document.getElementById("calsWomen").innerHTML = calories;
}
我用 caloriesBurntFemale 函数和 caloriesBurntMale 函数返回 NaN。如何确保在这两个函数中得到的是数字而不是 NaN?
变量 milesRun
在函数 milesRun
中声明。因此函数 caloriesBurntMale
将无法访问它,因为在 js 中变量的作用域处于函数级别。
在这种情况下,您可以在函数外部声明变量,以便可以从其他函数访问它
var milesRun='';
function milesRun(){
//rest of the code
milesRun = (stepsRun*1) * .0000157828 * (stepInches*1).toFixed(2);
document.getElementById("milesIRun").innerHTML = milesRun;
}
function caloriesBurntMale(){
calories = milesRun*1 * 124;
}
有两个问题;一个是您的 'milesRun' 变量是在函数内部声明的(令人困惑的是,它也被命名为 'milesRun'),因此当其他函数尝试访问它时,它们将无法使用。
另一个是您尝试将字符串转换为数字 (foo*1
) 的方式,如果输入非数字,这仍将导致 NaN。
我倾向于使用这种技术,returns 如果可能的话,一个数字,或者零(如果输入不是数字):
Number(foo) || 0;
(等价的 shorthand 是 +foo || 0
,但读起来可能会造成混淆;我认为值得多敲几下键盘来让你清楚地知道你在输入一个数字。人们通常会建议改为 parseInt()
,如果你想要整数而不是数字,这很好(但不要忘记包括基数!)parseFloat()
是另一种选择;数字和之间有一些 differences parseFloat,这可能会根据您的需要使一个比另一个更合适。)
无论如何:题外话结束,这是一个使用该技术并将 milesRun 变量作为参数传递给其他函数的示例。我还重命名了 milesRun()
函数——严格来说这不是必需的,只要具有相同名称的变量始终包含在函数范围内,但重复名称肯定会引起混淆,因此最好避免它。
function milesRunFn() {
var run1 = Number(document.getElementById("runDist1").value) || 0;
var run2 = Number(document.getElementById("runDist2").value) || 0;
var run3 = Number(document.getElementById("runDist3").value) || 0;
var stepInches = Number(document.getElementById("steplength").value) || 0;
var stepsRun = run1 + run2 + run3;
var milesRun = stepsRun * .0000157828 * stepInches;
milesRun = milesRun.toFixed(2);
document.getElementById("milesIRun").innerHTML = milesRun;
caloriesBurntMale(milesRun);
caloriesBurntFemale(milesRun);
}
function caloriesBurntMale(milesRun){
calories = milesRun * 124;
calories = calories.toFixed(2);
document.getElementById("calsMen").innerHTML = calories;
}
function caloriesBurntFemale(milesRun){
calories = milesRun * 105;
calories = calories.toFixed(2);
document.getElementById("calsWomen").innerHTML = calories;
}
R1: <input id="runDist1"><br>
R2: <input id="runDist2"><br>
R3: <input id="runDist3"><br>
Step: <input id="steplength"><br>
<button onclick="milesRunFn()">Go</button><br>
Miles run:<span id="milesIRun"></span><br>
Women: <span id="calsWomen"></span><br>
Men: <span id="calsMen"></span><br>
(您也可以在全局范围内声明 var milesRun
,这样所有函数都可以访问它,但传递参数可能是更好的方法。)