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

TypeScript Parser类binOp方法调用时变为undefined报错排查

问题根因

这是JS/TS类方法this上下文丢失导致的错误,和Next.js运行环境无关。
类方法被当做参数传递后直接调用时,会脱离原实例的上下文绑定:严格模式下方法内部的this会指向undefined。
首次从parse调用expression再触发binOp时,是通过实例属性调用方法,this绑定正常因此不会报错;但进入binOp内部后,直接调用传入的func()(即传入的term/factor方法引用)时,方法没有绑定Parser实例,内部this变为undefined,此时term方法里执行this.binOp(...)就会抛出找不到binOp的错误。

修复方法

两种方案二选一即可:

  • 方案1(推荐,改动量最小):在binOp内部调用传入方法时,手动绑定当前实例作为this上下文,同时修正原代码中写死运算符判断的逻辑bug:
binOp(func:any, ops:string[]) {
    console.log("here")
    // 绑定当前Parser实例为func执行时的this
    let left: any = func.call(this)

    // 原代码此处写死判断乘除号,未使用传入的ops参数,会导致加减运算解析失效,此处一并修复
    while(ops.includes(this.currentTok.type)) {
        let opTok = this.currentTok
        this.advance()
        let right = func.call(this)
        left = new BinOpNode({leftNode:left, opTok:opTok, rightNode:right})
    }

    return left       
}
  • 方案2:传递方法参数时提前绑定实例上下文:
term() {
    return this.binOp(this.factor.bind(this), [TT_MUL, TT_DIV])
}

expression() {
    return this.binOp(this.term.bind(this), [TT_PLUS, TT_MINUS])
}

注意如果选方案2,仍然需要修复binOp内while循环写死运算符判断的问题,否则表达式优先级解析逻辑会出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:45:52