猿问

JS 清除不清除整个画布

我对js有点陌生,遇到了一个问题。我试图创建一个天空中的星星动画。我通过在画布上随机创建小圆圈,然后随机选择闪烁的星星(不透明度已更改)来做到这一点。然后我意识到网站在缩放时无法正常工作,所以我决定为窗口大小调整实现一个onevent,当窗口调整大小时,我再次运行相同的函数来重新创建相同的过程,但是在清除所有以前的星星的同时,它们不会成倍增加。这里的问题是,clearRect方法似乎没有为我清除先前绘制的星星。:),任何帮助将不胜感激。这是我的代码。


let starCollection  = [];

let randomStars     = [];

let numberofStars   = 100;

let flickeringStars = 50;


class Star{

    constructor(x,y,color,radius){

        this._canvas        = document.querySelector('canvas');

        this._canvas.width  = window.innerWidth;

        this._canvas.height = window.innerHeight; 

        this._c             = this._canvas.getContext('2d');

        this._radius        = radius;


        this._x       = x;

        this._y       = y;

        this._color   = color;     

    }


    //drawing individual stars

    draw(){

        //Drawing

        this._c.beginPath();

        this._c.arc(this._x,this._y,this._radius,0,Math.PI * 2,false);

        this._c.fillStyle   = this._color;

        this._c.strokeStyle = 'black';

        this._c.stroke();

        this._c.fill();

        this._c.closePath();

    }

    //Fade in and out for stars

    flicker(){


        setTimeout(()=>{this._color='#EBEBEB';},300);

        setTimeout(()=>{this._color='#D9D9D9';},600);

        setTimeout(()=>{this._color='#B6B6B6';},900);

        setTimeout(()=>{this._color='#898787';},1200);

        setTimeout(()=>{this._color='#4F4F4F';},1500);


        setTimeout(()=>{this._color='black';},1800);

        setTimeout(()=>{this._color='#4F4F4F';},2100);

        setTimeout(()=>{this._color='#898787';},2400);

        setTimeout(()=>{this._color='#B6B6B6';},2700);

        setTimeout(()=>{this._color='#D9D9D9';},3000);

        setTimeout(()=>{this._color='#EBEBEB';},3300);

        setTimeout(()=>{this._color='#FFFFFF';},3600);


    }


}



慕慕森
浏览 148回答 1
1回答

海绵宝宝撒

您的问题出在闪烁功能中。即使在调整大小功能后,这些设置超时仍然会触发。所以他们称之为.draw(),即使这些星星已经从你的数组中移除了。该函数仍然记得“这”是什么。您可以像这样清除所有超时:&nbsp; window.addEventListener("resize", () => {&nbsp; &nbsp; let canvas = document.querySelector("canvas");&nbsp; &nbsp; let context = canvas.getContext("2d");&nbsp; &nbsp; canvas.width = window.innerWitdh;&nbsp; &nbsp; canvas.height = window.innerHeight;&nbsp; &nbsp; context.clearRect(0, 0, window.innerWidth, window.innerHeight);&nbsp; &nbsp; starCollection = [];&nbsp; &nbsp; randomStars = [];&nbsp; &nbsp; var id = window.setTimeout(function () { }, 0);&nbsp; &nbsp; while (id--) {&nbsp; &nbsp; &nbsp; window.clearTimeout(id); // will do nothing if no timeout with id is present&nbsp; &nbsp; }&nbsp; &nbsp; let event = new CustomEvent("showStars");&nbsp; &nbsp; dispatchEvent(event);});下面是一个有 10 颗星星的示例,其中 5 颗闪烁。我把星星做得更大,这样更容易看到。<html><head>&nbsp; &nbsp; <style>&nbsp; &nbsp; &nbsp; &nbsp; body {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; background: black;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; </style></head><body>&nbsp; &nbsp; <canvas></canvas>&nbsp; &nbsp; <script>&nbsp; &nbsp; &nbsp; &nbsp; let starCollection = [];&nbsp; &nbsp; &nbsp; &nbsp; let randomStars = [];&nbsp; &nbsp; &nbsp; &nbsp; let numberofStars = 10;&nbsp; &nbsp; &nbsp; &nbsp; let flickeringStars = 5;&nbsp; &nbsp; &nbsp; &nbsp; class Star {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; constructor(x, y, color, radius) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._canvas = document.querySelector('canvas');&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._canvas.width = window.innerWidth;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._canvas.height = window.innerHeight;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._c = this._canvas.getContext('2d');&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._radius = radius;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._x = x;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._y = y;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = color;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //drawing individual stars&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; draw() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Drawing&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._c.beginPath();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._c.arc(this._x, this._y, this._radius, 0, Math.PI * 2, false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._c.fillStyle = this._color;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._c.strokeStyle = 'black';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._c.stroke();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._c.fill();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._c.closePath();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Fade in and out for stars&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; flicker() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = '#EBEBEB';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 300);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = '#D9D9D9';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 600);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = '#B6B6B6';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 900);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = '#898787';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 1200);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = '#4F4F4F';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 1500);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = 'black';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 1800);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = '#4F4F4F';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 2100);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = '#898787';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 2400);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = '#B6B6B6';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 2700);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = '#D9D9D9';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 3000);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = '#EBEBEB';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 3300);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._color = '#FFFFFF';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 3600);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 300);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 600);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 900);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 1200);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 1500);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 1800);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 2100);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 2400);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 2700);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 3000);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 3300);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 3600);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; window.addEventListener("showStars", () => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Stars animation&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Adding the stars to the array as objects&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let i = 0; i < numberofStars; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let x = Math.floor(Math.random() * window.innerWidth);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let y = Math.floor(Math.random() * window.innerHeight);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // let starSize = (Math.random() + 1) - 0.7;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let starSize = 10;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; starCollection.push(new Star(x, y, "white", starSize));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Drawing all the stars on the screen&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let i = 0; i < starCollection.length; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; starCollection[i].draw();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Storing random stars&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const shuffleStars = () => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; randomStars = [];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let i = 0; i < flickeringStars; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; randomStars.push(Math.floor(Math.random() * starCollection.length))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shuffleStars();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Flickering stars randomly&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const starflicker = () => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(starCollection);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(randomStars);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; requestAnimationFrame(starflicker);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let i = 0; i < randomStars.length; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; starCollection[randomStars[i]].flicker();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shuffleStars();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 500);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; starflicker();&nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; &nbsp; window.addEventListener("resize", () => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let canvas = document.querySelector("canvas");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let context = canvas.getContext("2d");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; canvas.width = window.innerWitdh;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; canvas.height = window.innerHeight;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context.clearRect(0, 0, window.innerWidth, window.innerHeight);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; starCollection = [];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; randomStars = [];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var id = window.setTimeout(function () { }, 0);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (id--) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; window.clearTimeout(id); // will do nothing if no timeout with id is present&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let event = new CustomEvent("showStars");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent(event);&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent(new CustomEvent("showStars"))&nbsp; &nbsp; </script></body></html>查看这篇文章,了解有关超时清除代码如何工作的更多信息:&nbsp;javascript:清除所有超时?
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答