0

我有以下代码:

var soundManager = {
    var _explode = new Audio('/Content/sounds/explosion.ogg');

    var _coin = new Audio('/Content/sounds/coin.ogg');
    this.play = function (name){
        switch(name){
            case "explosion":
                _explode.play();
                break;
            case "coin":
                _coin.play();
                break;
        }
    };
};

Chrome 说我在第二行有一个错误,其中定义了 _explode。什么是语法错误?我正在尝试设置它,以便我可以调用 soundManager.play(nameOfSound) 让它播放一个 ogg 文件。

谢谢你。

-缺口

4

2 回答 2

2

正如@SayemAhmed 所说,您创建对象文字的语法不正确。而他的回答是正确的。

这是我的首选方式,将_explode_coin真正”设为私有:

var soundManager=(function(){
  var _explode=new Audio('/Content/sounds/explosion.ogg');
  var _coin=new Audio('/Content/sounds/coin.ogg');
  return {
    play:function(name){
      switch(name){
        case "explosion":
          _explode.play();
          break;
        case "coin":
          _coin.play();
          break;
      }
    }
  };
})();

现在不仅会_explode变得_coin不可访问,而且在使用 JS 压缩器(如 Google Closure Compiler)时,您还可以获得更“压缩”的大小,因为所有_explode_coin都将被最小化。

于 2012-12-05T05:29:05.077 回答
1

您不能在对象文字内以这种方式编写语句。尝试以下 -

var soundManager = {
    _explode: new Audio('/Content/sounds/explosion.ogg'),
    _coin: new Audio('/Content/sounds/coin.ogg'),

    play: function (name){
        switch(name){
            case "explosion":
                this._explode.play();
                break;
            case "coin":
                this._coin.play();
                break;
        }
    }
}

要稍后访问它,您可以使用以下内容 -

soundManager.play('explosion');
soundManager.play('coint');

您可以按照@Passerby 的建议进一步改进您的代码 -

var soundManager = (function () {
    var _explode = new Audio('/Content/sounds/explosion.ogg');
    var _coin = new Audio('/Content/sounds/coin.ogg');

    return {
        play: function (name) {
            switch (name) {
                case "explosion":
                    _explode.play();
                    break;
                case "coin":
                    _coin.play();
                    break;
            }
        };
    };
})();

以这种方式使用闭包,只有play方法可以访问_explode_coin变量。

于 2012-12-05T05:18:49.477 回答