Javascript 防止多个音频上下文

Javascript 防止多个音频上下文,javascript,html,web-audio-api,Javascript,Html,Web Audio Api,我按照一种模式使用Webaudio将声音附加到对象。它工作得很好,但是如果我在一个页面上生成多个项目并附加此脚本,我会得到一个console.log,表明我已经超过了每页可用的AudioContext的最大数量 我的理解是,该行声明了audioContext附加到窗口的audioContext,而不是声明新的audioContext。如何询问窗口是否已经有AudioContext,并简单地将音频节点添加到其图形中 var that = this , audioContext = window

我按照一种模式使用Webaudio将声音附加到对象。它工作得很好,但是如果我在一个页面上生成多个项目并附加此脚本,我会得到一个console.log,表明我已经超过了每页可用的AudioContext的最大数量

我的理解是,该行声明了
audioContext
附加到窗口的audioContext,而不是声明新的audioContext。如何询问窗口是否已经有AudioContext,并简单地将音频节点添加到其图形中

var that = this
  , audioContext = window.AudioContext || window.webkitAudioContext;

if (!audioContext) {
  console.warn("Web Audio API not supported in this browser.");
  return;
}

this.context = new audioContext();

我不能完全肯定我理解你的问题。为什么不能在脚本顶部创建一个音频上下文,然后让代码的其余部分引用它

为了提供答案,您可以这样做:

var getContext = function() {
  var ac = null;
  if ( !window.AudioContext && !window.webkitAudioContext ) {
    console.warn('Web Audio API not supported in this browser');
  } else {
    ac = new ( window.AudioContext || window.webkitAudioContext )();
  }
  return function() {
    return ac;
  };
}();
然后,每次需要上下文时,只需调用以下函数:

var ctx = getContext(),
  osc = ctx.createOscillator();
osc.connect(ctx.destination);

我想你得自己检查一下。这些电话你打了好几次了吗?这是一个模块吗?您可以尝试将上下文设置为全局上下文。它位于一个模块中,并且该脚本连接到许多对象。对于少于4个实例,这是可以的,但超过4个实例,它会丢弃语音并记录消息。全球环境将是完美的。“我该怎么做呢?”凯文·恩尼斯回答道。否则,只需将创建音频上下文的代码移到模块外,而不是使用
this.context
,只需使用
context
。这非常有效。但是我不完全明白为什么。你能给我指出一些关键词或概念来解释为什么这样做吗?基本思想是它使用闭包。从本质上说,外部函数立即执行(注意末尾的括号??调用它的括号),并为您创建音频上下文。它还返回一个只返回音频上下文的新函数。因此,您基本上是说“
getContext
等于调用此外部函数的结果”。因为外部函数的返回值是另一个函数,这就是你得到的。一开始,闭包可能有点让人难以理解(它们是为我准备的)——但谷歌搜索一下应该会让你走上正轨。