Observable实现疑问:未声明的_unsubscribe与this._subscribe为何可运行
你提到的两个看似未声明的函数,其实都是通过函数作为参数传递+动态赋值实现的,属于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

