ES6箭头函数语法错误及Tree类方法调用异常咨询
问题分析与修复方案
咱们一个一个来拆解你遇到的问题:
1. 箭头函数作为类属性的语法错误
你碰到的SyntaxError: Unexpected token =,核心原因是**类字段语法(直接在类内用方法名 = 箭头函数的形式定义成员)**是ES2022才正式纳入标准的特性。如果你的运行环境(比如旧版本Node.js、未配置转译的浏览器)不支持这个语法,就会触发这个报错。
早期的ES6类规范只允许在class块内定义普通方法(比如getRoot() {}这种写法),不支持直接赋值类成员的方式。
快速解决方向:
要么把findNode改成普通的类方法,要么升级你的运行环境到支持ES2022+的版本(比如Node.js 16.x及以上),或者用Babel这类工具转译代码。
2. 改成普通函数后findNodeWithID失效的原因
先看你修改后的findNode逻辑:
findNode(node, id) { if(node.id === id) { return node; } else { node.getChildren().forEach(child => { this.findNode(child, id); }); } return null; }
问题出在**forEach遍历子节点时,完全没处理递归的返回值**。forEach只是单纯执行每个回调函数,不会收集回调里的返回值,也不会因为回调返回了结果就终止遍历。哪怕某个子节点递归找到了目标,这个结果也不会被传递到上层函数,最后整个方法还是会走到return null。
修复后的代码示例:
我们需要遍历子节点时,一旦找到匹配的节点就立即返回,替换掉无法传递返回值的forEach。这里用for...of循环或者Array.prototype.find都可以:
方案一:用for...of循环
class Tree { constructor(rootNode) { this._rootNode = rootNode; rootNode.makeRoot(); } getRoot() { return this._rootNode; } findNodeWithID(id) { return this.findNode(this._rootNode, id); } // 改成普通类方法并修复递归逻辑 findNode(node, id) { if(node.id === id) { return node; } // 遍历子节点,找到匹配项立即返回 for (const child of node.getChildren()) { const foundNode = this.findNode(child, id); if (foundNode) { return foundNode; } } // 所有子节点都未匹配,返回null return null; } }
方案二:用Array.prototype.find简化代码
findNode(node, id) { if(node.id === id) { return node; } // 利用find的特性:找到第一个符合条件的元素就返回 return node.getChildren().find(child => this.findNode(child, id)) || null; }
这样修改后,findNodeWithID就能正确返回匹配的节点了。
内容的提问来源于stack exchange,提问作者Asool
相关产品推荐
相关产品推荐

