求助:如何在JavaScript类方法的forEach循环内调用内部函数?
问题解决思路
首先明确几个核心错误点:
- 直接调用
e.setKey()时,数组内的对象e本身并没有setKey方法,自然会提示找不到。 e.this.setKey()是完全错误的写法,this是JavaScript的上下文关键字,不是对象的属性,无法通过某个对象访问。
下面给你三种可行的解决方案:
方案一:直接调用局部的setKey函数
因为你在forEach里用了箭头函数,它的上下文和外层Graph方法一致,而且setKey是Graph方法内部的局部函数,箭头函数里可以直接访问到它。修改代码如下:
class Mazefinder { constructor() { } Graph() { this.vertices = this.mazeArray; function setKey(key) { let setKeyStack = [key]; return setKeyStack; } this.vertices.forEach((e) => { if (e === s) { const keyToAdd = this.nodeIDS + this.nodeIdCount.toString(); // 直接调用局部的setKey,无需绑定到任何对象 const keyStack = setKey(keyToAdd); // 如果需要把结果赋值给e,可添加:e.keyStack = keyStack; } }) } }
这个方案最直接,适合setKey仅在Graph方法内部使用的场景。
方案二:给数组对象e添加setKey方法
如果你确实需要让e对象自身能调用setKey,可以直接把这个函数赋值给e的属性:
class Mazefinder { constructor() { } Graph() { this.vertices = this.mazeArray; function setKey(key) { let setKeyStack = [key]; return setKeyStack; } this.vertices.forEach((e) => { if (e === s) { const keyToAdd = this.nodeIDS + this.nodeIdCount.toString(); // 给当前e对象添加setKey方法 e.setKey = setKey; // 现在可以通过e调用该方法 const keyStack = e.setKey(keyToAdd); } }) } }
注意:这种方式只会给符合条件的e对象添加方法,数组内其他元素不会拥有这个方法。
方案三:把setKey改成类的实例方法
如果setKey需要在类的其他方法里复用,直接把它定义成类的实例方法更合适:
class Mazefinder { constructor() { } // 定义为类的实例方法 setKey(key) { let setKeyStack = [key]; return setKeyStack; } Graph() { this.vertices = this.mazeArray; this.vertices.forEach((e) => { if (e === s) { const keyToAdd = this.nodeIDS + this.nodeIdCount.toString(); // 通过this调用类的setKey方法 const keyStack = this.setKey(keyToAdd); // 如果要让e也能调用,可赋值:e.setKey = this.setKey.bind(this); // 之后即可用e.setKey(keyToAdd);调用 } }) } }
这种方式扩展性最好,适合多个方法需要复用setKey逻辑的场景。
内容的提问来源于stack exchange,提问作者KirB
相关产品推荐
相关产品推荐

