函数内部的函数;变量在不知不觉中变化,为什么?(Javascript)

Function inside Function; variable changing unwantedly, why? (Javascript)

本文关键字:函数 为什么 Javascript 变化 内部 变量 不知不觉      更新时间:2023-09-26

所以几天前我刚开始写几行代码,我想用迄今为止获得的知识制作一个计算器,但由于我不知道的原因,在ReCalFN()内部调用CalculationFN()后,我看到num2act的变量发生了变化。为什么会这样?我该怎么解决?//为什么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"); }
   }

考虑避免全局变量和副作用。将所需的变量作为参数传递。