全局变量未更新

为什么你会做

我正在尝试制作Chuck Norris笑话发生器。我有一个生成新的笑话按钮,可以从api获取一个新的笑话,并且我有几个具有不同笑话类别的按钮。

我有一个全局变量categories,每当单击类别按钮时,我都会尝试对其进行突变,但是当获取新的笑话时,该变量将继续具有默认值。

我究竟做错了什么 ?

这是代码:

document.addEventListener('DOMContentLoaded', start);
let category = 'animal';

async function fetchJoke(arrayz) {
    const response = await Promise.all(arrayz.map(url => fetch(url).then(response => response.json())));

    return response;
}

function start() {
    console.log('ready');
    fetchJoke(arrayz).then(render);
}

const arrayz = [`https://api.chucknorris.io/jokes/random?category=${category}`, 'https://api.chucknorris.io/jokes/categories'];


function render(data) {
    const main = document.querySelector('main');
    main.innerHTML = '';
    const clone = document.querySelector('.template').content.cloneNode(true);
    const joke = clone.querySelector('p');

    joke.textContent = data[0].value;

    clone.querySelector('.zbutton').addEventListener('click', () => {
        start();
    });
    createButton(data, clone);

    main.appendChild(clone);
}

function createButton(data, clone) {
    data[1].map(category => {
        const button = document.createElement('button');
        button.appendChild(document.createTextNode(category));
        button.addEventListener('click', (e) => {
            category = e.target.innerText;
            start();
        });

        clone.querySelector('.buttons').appendChild(button);
    })
}

链接到jsfiddle

https://jsfiddle.net/rcej8mkf/4/

昆汀

您有两个名为的变量category

  • let在脚本顶部创建的一个,您只能从中读取。
  • 一个是最后一个传递给您的函数的第一个也是唯一的参数的名称map

您覆盖了后者,但随后再也没有阅读它。


如果您想在此时覆盖全局变量,请不要在较窄的范围内用同名的另一个变量屏蔽它。

当然,这会带来另一个问题,即在生成要分配给中的第一项的字符串时,您只能读取一次全局category变量arrayz

您需要对其内部start进行更新,以使其发挥任何作用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章