0

私は、この O'Reilly Book の Web オーディオ チュートリアルに取り組んでいます。

次のコードは、オーディオ ファイルを一時停止して再生を再開するシステムを作成することを想定しています。

// Assume context is a web audio context, buffer is a pre-loaded audio buffer.
var startOffset = 0;
var startTime = 0;

function pause() {
  source.stop();
  // Measure how much time passed since the last pause.
  startOffset += context.currentTime - startTime;
}

function play() {
  startTime = context.currentTime;
  var source = context.createBufferSource();
  // Connect graph
  source.buffer = this.buffer;
  source.loop = true;
  source.connect(context.destination);
  // Start playback, but make sure we stay in bound of the buffer.
  source.start(0, startOffset % buffer.duration);
}

ただし、pause()関数を実行すると、次のエラーが発生します。

Uncaught ReferenceError: source is not defined 

私の観点からすると、これはキーワードsourceで定義されているvarため、関数にスコープが設定されているplay()ため、にアクセスできないために発生しpause()ます。キーワードを削除すると、var実際に問題が解決します。私の推論が正しいと誰かが私を安心させることができますか? これは単なるタイプミスですか、それとも私が理解していない根本的な原則がありますか? (本の正誤表を確認しましたが、そこには言及されていません。)

4

3 に答える 3

2

とareとsource同じようにグローバル変数を作成します。startOffsetstartTime

于 2013-10-14T16:17:24.233 に答える
0

これを試して:

function a(advName,area) {
   onclick="sub(\'' +advName+ '\',\'' +area+ '\');"
}
于 2014-05-09T14:54:55.947 に答える
0

関数内で変数を宣言すると、その変数はローカル変数になります。つまり、変数はその関数内にのみ存在するため、その関数内でのみ参照できます。これをグローバル変数として宣言すると、任意の Javascript 関数で使用できるようになりますが、一般に、グローバル名前空間をできるだけ汚染しないようにする必要があります。

function AudioPlayer(buffer) {
  this.startOffset = 0;
  this.startTime = 0;      
  this.source = null;
  this.buffer = buffer;
}

AudioPlayer.prototype.pause = function() {
  if (!this.source) {
    return;
  }
  this.source.stop();
  // Measure how much time passed since the last pause.
  this.startOffset += context.currentTime - this.startTime;
}

AudioPlayer.prototype.play = function() {
  this.startTime = context.currentTime;
  this.source = context.createBufferSource();
  // Connect graph
  this.source.buffer = this.buffer;
  this.source.loop = true;
  this.source.connect(context.destination);
  // Start playback, but make sure we stay in bound of the buffer.
  this.source.start(0, this.startOffset % this.buffer.duration);
}

これらの関数を次のように呼び出すことができます。

var player = new AudioPlayer(buffer);
player.play();
player.pause();
于 2013-10-14T16:47:43.673 に答える