Javascript Subject调用next导致一个奇怪的错误

Javascript Subject调用next导致一个奇怪的错误,javascript,rxjs,Javascript,Rxjs,这会导致以下错误:无法读取未定义的属性“length” const msg$ = new Subject<string>(); msg$.subscribe(console.log) of("Hello").subscribe(msg$.next); const msg$=new Subject(); msg$.subscribe(console.log) 订阅(msg$.next); 但是,如果我在函数中包装msg$.next,那么它可以正常工作,没有任何

这会导致以下错误:
无法读取未定义的属性“length”

const msg$ = new Subject<string>();
msg$.subscribe(console.log)
of("Hello").subscribe(msg$.next);
const msg$=new Subject();
msg$.subscribe(console.log)
订阅(msg$.next);

但是,如果我在函数中包装msg$.next,那么它可以正常工作,没有任何错误

  • Lambda函数
const msg$=new Subject();
msg$.subscribe(console.log)
订阅(问候语=>msg$.next(问候语));
  • 匿名函数
const msg$=new Subject();
msg$.subscribe(console.log)
订阅(功能(问候语){
msg$.next(问候语);
});
  • 命名函数
功能NEXTMG(问候语){
msg$.next(问候语);
}
const msg$=新主题();
msg$.subscribe(console.log)
认购(NEXTMG);


它们都只是包装函数,除了调用下一个函数外,似乎什么也不做。这是怎么回事?看来这里有一个我不知道的JavaScript抓到你了。

为了子孙后代,我接受了这个答案



我认为这个问题可以归结为“当将函数作为参数传递时,“this”的值是多少?”。你可以在这里找到一些答案

在第一个示例中的值错误。如果将
console.log(this)
放在
nextsg
中,您将看到它是一个
SafeSubscriber
,它缺少可访问的属性
observators.length
。rxjs6中的
Subject#next
函数依赖于它成为具有
observer.length属性的
Subject


是的,当然。我没有注意到这似乎很愚蠢
msg$.next.bind(msg$)
有效


obj.func
没有将
obj
作为上下文,而
obj.func()
作为上下文。

为了子孙后代的缘故接受了答案



我认为这个问题可以归结为“当将函数作为参数传递时,“this”的值是多少?”。你可以在这里找到一些答案

在第一个示例中的值错误。如果将
console.log(this)
放在
nextsg
中,您将看到它是一个
SafeSubscriber
,它缺少可访问的属性
observators.length
。rxjs6中的
Subject#next
函数依赖于它成为具有
observer.length属性的
Subject


是的,当然。我没有注意到这似乎很愚蠢
msg$.next.bind(msg$)
有效


obj.func
没有将
obj
作为上下文,而
obj.func()
有上下文。

我认为这个问题归结为“当将函数作为参数传递时,“this”的值是什么?”。你可以在这里找到一些答案<代码>此
在第一个示例中的值错误。如果将
console.log(this)
放在
nextsg
中,您将看到它是一个
SafeSubscriber
,它缺少可访问的属性
observators.length
。rxjs6中的
Subject.next
函数依赖于
this
成为
Subject
observators.length
属性。当然是的。我没有注意到这似乎很愚蠢
msg$.next.bind(msg$)
有效
a.func
没有
a
作为上下文,而
a.func()有。如果你把你的评论作为答案,我会接受。如果你使用
source$.subscribe(主观性)
,它也会起作用。它将自动调用
subject.{next,error,complete}()
,具体取决于
source$
发出的内容。我认为这个问题归结为“当将函数作为参数传递时,“this”的值是多少?”。你可以在这里找到一些答案<代码>此
在第一个示例中的值错误。如果将
console.log(this)
放在
nextsg
中,您将看到它是一个
SafeSubscriber
,它缺少可访问的属性
observators.length
。rxjs6中的
Subject.next
函数依赖于
this
成为
Subject
observators.length
属性。当然是的。我没有注意到这似乎很愚蠢
msg$.next.bind(msg$)
有效
a.func
没有
a
作为上下文,而
a.func()有。如果你把你的评论作为答案,我会接受。如果你使用
source$.subscribe(主观性)
,它也会起作用。它将自动调用
subject.{next,error,complete}()
,具体取决于
source$
发出的内容。
const msg$ = new Subject<string>();
msg$.subscribe(console.log)
of("Hello").subscribe(greeting => msg$.next(greeting));
const msg$ = new Subject<string>();
msg$.subscribe(console.log)
of("Hello").subscribe(function(greeting){
  msg$.next(greeting);
});
function nextMsg(greeting){
  msg$.next(greeting);
}
const msg$ = new Subject<string>();
msg$.subscribe(console.log)
of("Hello").subscribe(nextMsg);