网站搜索

javascript - 不清楚的括号指令 "this.fn.bind(this)(super.fn(...args)"


所以在一个项目中,我发现了一段可以简化为以下内容的代码:

export abstract class Logger {
    private static log(level: LogLevels, ...args: Array<any>) {/**/}
    public error(...args: Array<any>): LogData {
        return Logger.log(LogLevels.ERROR, ...args);
    }
}

export class LoggerService extends Logger {
    public error(...args: Array<any>): any {
        return this._log.bind(this)(super.error(...args));
    }

    private _log(logData: LogData) {
        let logstashLoggerData = this.extendLoggerData(logData);
        return this.logStashApi.log(logstashLoggerData)
            .toPromise()
            .catch(err => console.error(err));
    }

}

我有点担心这一行:this._log.bind(this)(super.error(...args));。

我第一次看到这样的东西,所以我更倾向于小心,不想弄坏什么。这并不是针对 Promise 或 .bind() 的特殊情况,对吧?根据我的测试,这条语句似乎可以直接简化为 this._log(super.error(...args));(但那为什么要复杂化呢?),有人能确认吗?

答案#1

是的,你可以而且应该去掉这个内联绑定。不过我建议将其移动到类的构造函数中(而不是完全去掉绑定),因为这样你就可以将服务方法(error、warning 等)作为“普通函数”使用,这在你需要从模块中导出它们而不暴露 LoggerService 实例本身时会很有帮助。