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