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
相关产品推荐
相关产品推荐

