Javascript JS错误:未定义变量。。。。但事实确实如此

Javascript JS错误:未定义变量。。。。但事实确实如此,javascript,Javascript,首先,如果这是一个愚蠢的问题,我道歉。很可能我完全错过了一些琐碎的事情。我不知道是什么。问题是: (上下文:我正在用JavaScript制作任意精度的数学库) 代码如下: function processInput(n){ let parts; let numer, denom, positivity; if(is.negative(n)){ positivity = -1; n

首先,如果这是一个愚蠢的问题,我道歉。很可能我完全错过了一些琐碎的事情。我不知道是什么。问题是:

(上下文:我正在用JavaScript制作任意精度的数学库)

代码如下:

    function processInput(n){       
        let parts;
        let numer, denom, positivity;
        if(is.negative(n)){
            positivity = -1;
            n = n.substr(1);
        } else {
            positivity = 1;
        }
        ////////// RELEVANT SECTION STARTS ///////////////
        console.log(n); // prints "1 2/3", which is what I'm testing
        if(is.zero(n)){
            numer = [0], denom = [1], positivity = 0;
        } else if(is.mixedFrac(n)){
            console.log(n); // <------ error: "n is not defined". How???
            parts = n.match(/\d+/g).map(function(e){
                return ArrayOps.wholeToArnum(n);
            });
        ////////// RELEVANT SECTION ENDS ///////////////
            let w = parts[0], 
                n = parts[1],
                d = parts[2];
            let n1 = ArrayOps.multiply(w, d);
            numer = ArrayOps.add(n1, n);
            denom = d;
        } else if(is.frac(n)){
            parts = n.match(/\d+/g).map(function(e){
                return ArrayOps.wholeToArnum(e);    
            });
            numer = parts[0];
            denom = parts[1];
        } else if(is.repeatingDecimal(n)){
            let temp = n.split('...');
            let dec = ArrayOps.decToArnum(temp[0]);

            let decLength = dec.decLength;
            let repDec = ArrayOps.repDecToArnum(temp[1], decLength);

            let n1 = dec.numer;
            let d1 = dec.denom;
            let n2 = repDec.numer;
            let d2 = repDec.denom;
            n1 = ArrayOps.multiply(n1, d2);
            n2 = ArrayOps.multiply(n2, d1);
            numer = ArrayOps.add(n1, n2);
            denom = ArrayOps.multiply(d1, d2);
        } else if(is.decimal(n)){
            n = ArrayOps.decToArnum(n);
            numer = n.numer;
            denom = n.denom;
        } else if(is.wholeNum(n)){
            numer = ArrayOps.wholeToArnum(n);
            denom = [1];
        } else {
            throw new Error(`${n} is not a valid form of input.`);
        }
        return {numer, denom, positivity};
    }
以下是调试的屏幕截图:

正如我在红色矩形中突出显示的,调试器清楚地显示了
n=“1 2/3”
,并且它通过了测试(
is.mixedFrac(n)
),因为它是混合分数

is.mixedFrac(n)
中没有任何东西可以更改
n

继续会产生以下错误:

如果
n
一开始没有定义,我就不应该通过测试。有人能帮我做些什么吗?再说一次,我确信这是一个小错误。但我没看到

注意事项:

  • 将if控件更改为
    if(is.mixedFrac(n)&&n)
    仍传递到括号内
  • 我知道屏幕截图是不受欢迎的,但如果你看它,当我在断点处将鼠标悬停在
    n
    上时,它仍然会显示
    n
    “12/3”
  • 绝对没有发生异步的事情。没有超时、ajax、promise或任何事情。我的全部代码都很初级
  • 在FireFox中,它给了我以下错误:
    “ReferenceError:无法在初始化之前访问词法声明'n'”

您在同一if语句(这是一个块)中重新声明了变量
n
let
是块范围的,这意味着
n
仅存在于该块中。但是您已经声明了一个与上面的作用域同名的变量,这将覆盖它

    ////////// RELEVANT SECTION STARTS ///////////////
    console.log(n); // prints "1 2/3", which is what I'm testing
    if(is.zero(n)){
        numer = [0], denom = [1], positivity = 0;
    } else if(is.mixedFrac(n)){
        console.log(n); // <------ error: "n is not defined". How???
        parts = n.match(/\d+/g).map(function(e){
            return ArrayOps.wholeToArnum(n);
        });
    ////////// RELEVANT SECTION ENDS ///////////////
        let w = parts[0], 
            n = parts[1], // HERE!
            d = parts[2];
        let n1 = ArrayOps.multiply(w, d)

请添加您的代码…这样我们可以帮助您:-)如果JS说变量没有定义,那么它就没有定义。有两个常见的原因,第一个是计时,即试图在声明变量之前引用它。第二个是范围,即引用的变量超出了引用者的范围。选择你的。方法MixedFrac在哪里?你能在函数processInput(n){之后运行控制台.log(n)吗?下面是一个例子,说明为什么我们需要所有代码:(运行并检查日志)
    ////////// RELEVANT SECTION STARTS ///////////////
    console.log(n); // prints "1 2/3", which is what I'm testing
    if(is.zero(n)){
        numer = [0], denom = [1], positivity = 0;
    } else if(is.mixedFrac(n)){
        console.log(n); // <------ error: "n is not defined". How???
        parts = n.match(/\d+/g).map(function(e){
            return ArrayOps.wholeToArnum(n);
        });
    ////////// RELEVANT SECTION ENDS ///////////////
        let w = parts[0], 
            n = parts[1], // HERE!
            d = parts[2];
        let n1 = ArrayOps.multiply(w, d)