JavaScript中的getUserMedia()在浏览器中规范化。非法调用

时间:2014-12-18 17:07:41

标签: javascript function getusermedia invocation

当我尝试执行以下操作时:

var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
// now I try to invoke it with some parameters:
getUserMedia(...) // not working!

它在Chrome中引发错误“非法调用”。

但如果我这样做:

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
// now invoke it with the navigator
navigator.getUserMedia(..) // Works

我尝试了一下,我读到它是一个上下文问题。但我仍然无法理解那是什么意思。在第一个例子中,getUserMedia变量最终得到一个对非函数的函数的引用(即,在chrome的情况下,它是webkitGetUserMedia),那么为什么我不能使用这个变量调用它呢?

(这实际上是一般的JavaScript问题,并非特定于WebRTC。)

1 个答案:

答案 0 :(得分:19)

显然,无论出于何种原因,它都需要上下文成为navigator对象。我注意到console.log也是如此 - 它需要console上下文。

当您执行navigator.getUserMedia时,上下文会自动设置为navigator,就像您在对象上调用方法时一样。如果您只是执行getUserMedia,则上下文(默认情况下)是全局的,因此会引发非法调用错误。

如果您仍想将其保存为变量,可以在运行时使用正确的上下文调用它:

var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
// now I try to invoke it with some parameters:  
getUserMedia.call(navigator, ...)

您还可以使用bind来保存变量的上下文,这样您就不必每次都调用它:

var getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia).bind(navigator);
// now I try to invoke it with some parameters:  
getUserMedia(...)