初始化前不能访问“变量”

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插入数组的开头。

以上是关于初始化前不能访问“变量”的主要内容,如果未能解决你的问题,请参考以下文章

为什么我们不能通过未初始化的局部变量访问静态内容?

类静态成员变量和静态成员函数的访问方式

静态变量,静态代码块

初始化前无法访问“variable_name”

GoLang学习之变量定义和初始化

Swift学习笔记-内存安全性