JS错误:变量未定义。

时间:2018-06-21 05:02:42

标签: javascript

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

(上下文:我正在使用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};
    }

(JS小提琴:http://jsfiddle.net/k4mjwg57/3/

基本上,这就是它的原因:

function process(n){
  if(passTest(n)){
    console.log(n); // Error: "n is not defined"
  }
}

这是调试的屏幕截图: n is defined.

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

is.mixedFrac(n)中没有任何内容可以更改n

继续会产生以下错误: The error

如果一开始没有定义n,那么我不应该通过测试。有人可以帮我解决所发生的事情吗?同样,我确定这是一个小错误。但是我没看到。

注意事项:

  • 将if控件更改为if(is.mixedFrac(n) && n)仍会传递到括号内
  • 我知道我们不建议使用屏幕截图,但是如果您查看屏幕截图,并且在断点处将鼠标悬停在n上,它仍将显示n"1 2/3"。 / li>
  • 绝对没有异步事件发生。没有超时,ajax,promise或任何事情发生。我的代码的全部还很初级。
  • 在FireFox中,它给我以下错误:"ReferenceError: can't access lexical declaration `n' before initialization"

1 个答案:

答案 0 :(得分:3)

您在同一if语句(这是一个块)中重新声明了变量nlet是块作用域的,这意味着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)

let n = [1,2,3]
if (true) {
	console.log(n)
	let n = 10
}

这基本上就是您要做的。现在,let n声明是该块中可以存在的唯一n,并且您已经尝试在声明变量之前console.log进行