函数内部的函数;变量在不知不觉中变化,为什么?(Javascript)
Function inside Function; variable changing unwantedly, why? (Javascript)
所以几天前我刚开始写几行代码,我想用迄今为止获得的知识制作一个计算器,但由于我不知道的原因,在ReCalFN()
内部调用CalculationFN()
后,我看到num2
和act
的变量发生了变化。为什么会这样?我该怎么解决?//为什么num2
的变量在进入ReCalFN()
后变为未定义我知道有更好的方法来制作计算器,但我想这是我的版本。如果你有什么建议,请说,我很感激。(对我的英语感到抱歉)。感谢您的阅读。
//Input start
var num1 = prompt("Num1");
if ( ( num1 <= 0 ) || ( num1 > 0 ) ) {
var act = prompt("Action");
if ( (act == "+") || (act == "-") || (act == "*") || (act == "/") ||
(act == "%") ) {
var num2 = prompt("Num2");
if ( ( num2 <= 0 ) || ( num2 > 0 ) ) {
//Input end
//Calculator start
function CalculationFN () {
alert(num1); alert(act); alert(num2);
switch ( act ) {
case "+":
num1 = +num1 + +num2;
ReCalFN ();
break;
case "-":
num1 = +num1 - +num2;
ReCalFN ();
break;
case "*":
num1 = +num1 * +num2;
ReCalFN ();
break;
case "/":
if ( ( act == "/" ) && ( num2 == 0) )
{ alert("Error: Undifiend"); } else {
num1 = +num1 / +num2; }
ReCalFN ();
break;
case "%":
num1 = +num1 * +num2 /100;
ReCalFN ();
break;
}
}
//.............................
function ReCalFN () {
var act = prompt(" " + num1 + "'n New Action");
if ( (act == "+") || (act == "-") || (act == "*") || (act == "/") ||
(act == "%") ) {
//"num2 = undifined" why?...................
alert(num1); alert(act); alert(num2);
var num2 = prompt("AnyNum");
if ( ( num2 <= 0 ) || ( num2 > 0 ) ) {
alert(num1); alert(act); alert(num2);
CalculationFN ();
} else { alert("Error: no valid action"); }
} else { alert("Error: no valid value"); }
}
CalculationFN ();
//Calculator end
//Error start
} else { alert("Error: no valid value"); }
} else { alert("Error: no valid action"); }
} else { alert("Error: no valid value"); }
//Error end
您在ReCalFN
内部声明num2
,因此num2
引用新的局部变量,而不是全局变量。由于JavaScript提升,所有变量声明都被移到函数的顶部。
因此,您的ReCalFN
函数等效于:
function ReCalFN () {
// hoisted variables
var act;
var num2; // declared but not assigned, is not the global variable
act = prompt(" " + num1 + "'n New Action");
if ( (act == "+") || (act == "-") || (act == "*") || (act == "/") ||
(act == "%") ) {
// num2 is undefined
alert(num1); alert(act); alert(num2);
num2 = prompt("AnyNum"); // num2 has a value from now on
if ( ( num2 <= 0 ) || ( num2 > 0 ) ) {
// num2 is not undefined
alert(num1); alert(act); alert(num2);
CalculationFN ();
} else { alert("Error: no valid action"); }
} else { alert("Error: no valid value"); }
}
考虑避免全局变量和副作用。将所需的变量作为参数传递。
相关文章:
- jQuery函数:为什么第一个事件的完成延迟到第二个事件完成
- JavaScript:回调函数与匿名函数 – 为什么只有一个触发
- 节点.js带方括号的全局变量和函数 - 为什么这样做
- 为什么简单的MVC教程没有调用我的javascript函数?为什么可以't我也调试
- 当你改变原型时,构造函数为什么会改变?(参见代码)
- JS-op.继承和apply()函数.为什么没有'不起作用
- 立即调用的函数表达式运行最后定义的函数.为什么?
- 我必须将$scope基元封装在对象中,但可以在不封装它们的情况下使用函数.为什么?
- 很好的上传程序.cancelAll不是onComplate回调中的函数.为什么?
- javascript匿名函数:为什么我的脚本没有'不起作用
- JavaScript 函数 - 为什么这样做
- 学习Swift - inout函数-为什么要修改全局变量的值
- 剑道网格错误-网格.选择不是函数为什么
- 将window和undefined传递给立即调用的匿名函数.为什么?
- “使用Strict"破坏Javascript函数-为什么?
- JavaScript的keys()函数为什么没有文档
- JavaScript二进制缩减函数:为什么16 + 0返回0
- Javascript错误,无法识别函数.为什么
- 尝试执行FizzBuzz函数.为什么不工作
- 变量重赋值保留了以前的原型函数.为什么