0

次のようにオブジェクトを作成しました。

function StartObj() {
   var events = {
      a: function() {
         alert("hello");
      },
      b = function() {
         lightbox(events.a);
      }
   };

   this.main = function() {
      $("#objId").click(events.b);
   }

}

$(document).ready(function(){
      var _start_obj = new StartObj();
      _start_obj.main();
   });

そして別のファイルでは、

function lightbox(funcPtr) {
   alert(funcPtr);
}

アラートはfuncPtrが未定義であることを報告しています。また、グーグルクロームコンソール。

4

3 に答える 3

2

本気ですか?これは私にとってはうまくいきます...私はx.b()それを起動するための呼び出しを追加しました

var x = {

a: function() {
   alert("hello");
},

b: function() {
       var that = this;
       mayhem(that.a);
    }

}

function mayhem(funcPtr)
{
   funcPtr();
}

x.b();
于 2012-10-11T15:55:59.403 に答える
1

あなたはおそらくあなたが思っていることをしないでしょう。

この行var that = this;は役に立たずthis、とにかく、実際にはxではなく、x.b関数のレシーバーです。

これはあなたがそうするなら

x.b();

これは動作します

しかし、あなたがそうするなら

var f = x.b;
f();

これは機能しません。

x.bの動作が関数の受信者に依存しない ようにしたい場合は、次のようにすることができます:</ p>

var x = function(){
    var x ={
       a: function() {
           alert("hello");
       } 
    };
    x.b = function() {
        mayhem(x.a);
    }
    return x;
}();

new別の方法は、コンストラクターを作成し、演算子を使用してxを作成することです。


あなたが編集することに関して:

mainにアクセスできるようにする場合は、次のようにします。

function StartObj() {
   var events = {
      a: function() {
         alert("hello");
      }
   };

   events.b = function() {
         lightbox(events.a);
   };

   this.main = function() {
      $("#objId").click(events.b);
   }
}
于 2012-10-11T16:00:02.010 に答える
0

コンストラクターを台無しにしました-メソッドStartObjを持つオブジェクトを返さず、単なるローカル関数です。また、の割り当て後、閉じ中括弧が多すぎます。これは機能するはずです:mainmainevents.b

function StartObj() {
   var events = {
        a: function() {
            alert("hello");
        },
        b: function() {
            lightbox(events.a);
        }
    };

    this.main = function main() {
        $("#objId").click(events.b);
    }   
}

また、それlightboxが本当にグローバルに利用可能であることを確認してください-エラーコンソールを確認してください。

于 2012-10-11T16:29:00.130 に答える