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

TypeScript中Set迭代函数执行异常:this.courseAvailThisTerm未定义

嘿,这个问题我太熟了!核心就是回调函数里的this指向跑偏了,才导致找不到courseAvailThisTerm方法的!

先看你这段代码的问题点:

for(let quarter of degreePlan) { 
  foundationCourseSet.forEach(function(fc) { 
    if(this.courseAvailThisTerm(fc, quarter.term)) 
      console.log("It was avail!"); 
  }); 
}

你在forEach里用了普通的function(fc)作为回调,这种普通函数会绑定自己的this上下文——在严格模式下它会变成undefined,非严格模式下是全局对象,反正都不是你原来那个拥有courseAvailThisTerm方法的对象,自然就会报“undefined is not an object”的错了。

给你三个靠谱的解决办法,随便选一个都能搞定:

  • 用箭头函数(最推荐):箭头函数不会创建自己的this,它会直接继承外层作用域的this,完美匹配你的场景:

    for(let quarter of degreePlan) { 
      foundationCourseSet.forEach((fc) => { 
        if(this.courseAvailThisTerm(fc, quarter.term)) 
          console.log("It was avail!"); 
      }); 
    }
    
  • 给forEach传第二个参数指定this:forEach本身支持第二个参数,专门用来设置回调里的this指向,把外层的this传进去就行:

    for(let quarter of degreePlan) { 
      foundationCourseSet.forEach(function(fc) { 
        if(this.courseAvailThisTerm(fc, quarter.term)) 
          console.log("It was avail!"); 
      }, this); // 这里的this就是外层的正确上下文
    }
    
  • 提前把this存成变量:在循环前把正确的this存到一个变量里(比如that或者self),然后在回调里用这个变量代替this:

    const that = this; // 先把正确的this存起来
    for(let quarter of degreePlan) { 
      foundationCourseSet.forEach(function(fc) { 
        if(that.courseAvailThisTerm(fc, quarter.term)) 
          console.log("It was avail!"); 
      }); 
    }
    

这三种方法都能解决你的问题,其中箭头函数是ES6之后最简洁的写法,优先推荐用它~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:04:03