首先,很抱歉这是一个愚蠢的问题。我很可能会完全错过一些琐碎的事情。不知道是什么这就是问题所在:
(上下文:我正在使用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 = "1 2/3"
,并通过了测试(is.mixedFrac(n)
),因为它是混合分数。
is.mixedFrac(n)
中没有任何内容可以更改n
。
如果一开始没有定义n
,那么我不应该通过测试。有人可以帮我解决所发生的事情吗?同样,我确定这是一个小错误。但是我没看到。
注意事项:
if(is.mixedFrac(n) && n)
仍会传递到括号内n
上,它仍将显示n
是"1 2/3"
。 / li>
"ReferenceError: can't access lexical declaration `n' before initialization"
答案 0 :(得分:3)
您在同一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)
let n = [1,2,3]
if (true) {
console.log(n)
let n = 10
}
这基本上就是您要做的。现在,let n
声明是该块中可以存在的唯一n
,并且您已经尝试在声明变量之前console.log
进行>