You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用类Getter访问数组元素时触发Uncaught TypeError错误求助

问题:幻灯片组件触发TypeError错误

Uncaught TypeError: slideshows[i].images[slideshows[i].shownImage] is undefined

用户代码如下:

let slideshows = [];

class slideshow{
    constructor(images){
        this._images = images;
        this._shownImage = 0;
    }

    get images() {return this._images;}
    get shownImage() {return this._shownImage;}

    set images(images) {this._images = images;}
    set shownImage(shownImage) {this._shownImage = shownImage;}
}

// This function is called when the page has loaded in
function setupSlideshow(){
    // Create Array of all slideshows
    slideshowDivs = document.querySelectorAll("div.slideshow");
    for(i = 0; i < slideshowDivs.length; i++){
        slideshows.push(new slideshow(slideshowDivs[i].querySelectorAll("slideshow-image")));
    }

    // Show Active Image
    for(i = 0; i < slideshows.length; i++){
        slideshows[i].images[slideshows[i].shownImage].style.display = 'block';
        // The line above this one triggers the error
    }
}

用户猜测:语法没有问题,但JS类开发经验不足,猜测可能是JS无法识别slideshows[i]为slideshow类实例,因此未调用类中声明的方法。


问题原因与修复方案

  • DOM选择器错误
    querySelectorAll("slideshow-image")是在选择自定义标签<slideshow-image>,如果你的图片实际是用<img>标签或带类名的元素实现,这个选择器会返回空的NodeList。当images为空时,images[0]自然是undefined,触发错误。
    修复:根据实际HTML结构修改选择器,比如图片是带类名的<img>,就改成slideshowDivs[i].querySelectorAll("img.slideshow-image");如果确实使用自定义标签,确保HTML中存在<slideshow-image>元素。

  • 未检查images是否为空
    即使选择器正确,也可能存在某个幻灯片容器下没有图片的情况,直接访问images[shownImage]会报错。
    修复:在访问前增加判断逻辑:

    for(let i = 0; i < slideshows.length; i++){
        const currentSlideshow = slideshows[i];
        if (currentSlideshow.images.length > 0) {
            currentSlideshow.images[currentSlideshow.shownImage].style.display = 'block';
        }
    }
    
  • 变量未声明导致全局污染
    slideshowDivs和循环中的i都没有用let/const声明,会成为全局变量,可能引发意外问题。
    修复:补充变量声明:

    function setupSlideshow(){
        // Create Array of all slideshows
        const slideshowDivs = document.querySelectorAll("div.slideshow");
        for(let i = 0; i < slideshowDivs.length; i++){
            slideshows.push(new slideshow(slideshowDivs[i].querySelectorAll("slideshow-image")));
        }
    
        // Show Active Image
        for(let i = 0; i < slideshows.length; i++){
            const currentSlideshow = slideshows[i];
            if (currentSlideshow.images.length > 0) {
                currentSlideshow.images[currentSlideshow.shownImage].style.display = 'block';
            }
        }
    }
    
  • 关于类实例的误解
    你的猜测不成立,slideshows[i]确实是slideshow类的实例——因为你通过new slideshow()创建并推入数组,JS完全能识别并调用类的getter方法。错误核心是images为空或索引越界,和类方法调用无关。


内容的提问来源于stack exchange,提问作者RattatAndyGo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:10:27