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

Observable实现疑问:未声明的_unsubscribe与this._subscribe为何可运行

解惑:Observable实现中两个"未声明"函数的运行原理

你提到的两个看似未声明的函数,其实都是通过函数作为参数传递+动态赋值实现的,属于JavaScript函数式编程的常见用法,下面分别拆解:

1. this._subscribe(observer):来自Observable构造函数的参数赋值

Observable类的构造函数明确接收一个subscribe参数,并将其赋值给实例属性this._subscribe:

constructor(subscribe) {
  this._subscribe = subscribe;
}

当你调用Observable.from([0])时,from静态方法会创建一个新的Observable实例,同时传入了一个箭头函数作为subscribe参数:

static from(values) {
  return new Observable((observer) => {
    values.forEach((v) => observer.next(v));
    observer.complete();

    // 返回的注销函数
    return () => {
      console.log('unsubscribe');
    };
  });
}

所以numbers$这个Observable实例的this._subscribe,本质就是上面这个箭头函数。在Observable.subscribe方法里调用this._subscribe(observer),其实就是执行这个预先传入的箭头函数。

2. this._unsubscribe():来自_subscribe函数的返回值赋值

Observer类的_unsubscribe是一个实例属性,初始值为null:

constructor(handlers) {
  // ...
  this._unsubscribe = null;
}

在Observable.subscribe方法中,执行this._subscribe(observer)时,这个函数(也就是from里传入的箭头函数)会返回一个匿名函数:() => {console.log('unsubscribe');}。这个返回值会被直接赋值给observer._unsubscribe:

observer._unsubscribe = this._subscribe(observer);

当你调用subscription.unsubscribe()时,最终会触发Observer.unsubscribe方法,此时this._unsubscribe已经是那个预先定义好的匿名函数,所以调用this._unsubscribe()就会执行console.log('unsubscribe')。

总结

这两个函数都不是"未声明",而是通过函数作为参数传递和函数返回值赋值的方式,动态绑定到实例属性上的。这是RxJS等响应式库的核心设计思路之一——用函数封装订阅逻辑,并通过返回函数提供注销能力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:31:40