初始化前不能访问“变量”
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初始化前不能访问“变量”相关的知识,希望对你有一定的参考价值。
无法确定我有此错误消息:'Uncaught ReferenceError:初始化之前无法访问'颜色'。到目前为止我的代码:
window.onload = function() {
let colors = [
pickColor(),
"rgb(255, 255, 0)",
"rgb(0, 255, 0)",
"rgb(0, 255, 255)",
"rgb(0, 0, 255)",
"rgb(255, 0, 255)"
];
let squares = document.querySelectorAll('.square');
let pickedColor = pickColor();
let colorDisplay = document.getElementById('colorDisplay');
let messageDisplay = document.querySelector('#message');
let bigTitle = document.querySelector('#bigTitle');
colorDisplay.textContent = pickedColor;
for (let i = 0; i < squares.length; i++) {
//add initial colors to squares
squares[i].style.backgroundColor = colors[i];
//add click listeners to squares
squares[i].addEventListener('click', function() {
//grab color of clicked square
let clickedColor = squares[i].style.backgroundColor;
//compare color to pickedColor variable
if(clickedColor === pickedColor) {
messageDisplay.textContent = 'Correct bruh !';
changeColors(pickedColor);
}else{
squares[i].style.backgroundColor = '#232323';
messageDisplay.textContent ='Try again bro';
}
});
};
function changeColors(color) {
for (let i = 0; i < squares.length; i++) {
squares[i].style.backgroundColor = color; bigTitle.style.backgroundColor = color;
}
};
function pickColor() {
let random = Math.floor(Math.random() * colors.length);
return colors[random];
}
}//end of onload function
对我来说,我的变量“ colors”在一开始就已经声明过了,所以我不明白为什么我不能在我的“ pickColor”函数中使用它,因为它具有全局范围。有提示吗?
答案
您正在pickColor
初始化中调用colors
,并且pickColor
此时正在尝试访问尚未初始化的colors
。可能这只是一个错误,您不应该在该初始化中调用pickColor
:
let colors = [
"rgb(255, 255, 0)",
"rgb(0, 255, 0)",
"rgb(0, 255, 255)",
"rgb(0, 0, 255)",
"rgb(255, 0, 255)"
];
另一答案
let colors = [
pickColor(),
"rgb(255, 255, 0)",
"rgb(0, 255, 0)",
"rgb(0, 255, 255)",
"rgb(0, 0, 255)",
"rgb(255, 0, 255)"
];
// ...
function pickColor() {
let random = Math.floor(Math.random() * colors.length);
return colors[random];
}
要为变量colors
赋值,首先必须评估数组中的所有内容。并且pickColor
函数尝试访问colors
变量。哪个尚未初始化。
一种解决方法是先用字符串初始化,然后添加随机颜色:
let colors = [
"rgb(255, 255, 0)",
"rgb(0, 255, 0)",
"rgb(0, 255, 255)",
"rgb(0, 0, 255)",
"rgb(255, 0, 255)"
];
// ...
function pickColor() {
let random = Math.floor(Math.random() * colors.length);
return colors[random];
}
colors.push(pickColor());
console.log(colors);
另一答案
本:
let colors = [
pickColor(),
"rgb(255, 255, 0)",
"rgb(0, 255, 0)",
"rgb(0, 255, 255)",
"rgb(0, 0, 255)",
"rgb(255, 0, 255)"
];
在pickColor
为已声明但尚未初始化时调用colors
,因为在构建将(后来)分配给colors
的数组时正在执行此操作。”>
在pickColor
内,您正在访问colors
且未初始化。
您可以
执行此操作:let colors = [ undefined, "rgb(255, 255, 0)", "rgb(0, 255, 0)", "rgb(0, 255, 255)", "rgb(0, 0, 255)", "rgb(255, 0, 255)" ]; colors[0] = pickColor();
...但是您有机会选择条目
0
,因此最后以undefined
保留在索引0处。所以也许:
let colors = [ "rgb(255, 255, 0)", "rgb(0, 255, 0)", "rgb(0, 255, 255)", "rgb(0, 0, 255)", "rgb(255, 0, 255)" ]; colors.unshift(pickColor());
[
unshift
插入数组的开头。
以上是关于初始化前不能访问“变量”的主要内容,如果未能解决你的问题,请参考以下文章