2009-06-29 4 views
1

オブジェクト誰もが「」ここでは、変数へのアクセスを取得する方法を教えてもらえます:jQueryの閉鎖&プロパティへのアクセス

 
var test = { 
    a: 3, 
    init: function() { 
     $("body").click(function() { 
      alert(a); 
     }); 
    } 
}; 

test.init(); 

これはどちらか動作しません:警告(this.a)。

ありがとうございます。

答えて

0

あなたがオブジェクトを参照する必要があります。

test.a 
+0

全体的なオブジェクトという事実のためにそのカップルコード"test"と呼ばれる変数に格納されます。テストはオブジェクトの外部にあるので、これは良いパターンではありません。 – AnthonyWJones

0

は自己参照を追加します - :

 
var test = { 
    a: 3, 
    init: function() { 
     var self = this; 
     $("body").click(function() { 
      self.doit(); 
     }); 
    }, 

    doit: function() { 
     var self = this; 
     alert(self.a); 
    } 
}; 

を私は再利用する必要がある

var test = { 
    a: 3, 
    init: function() { 
     var self = this 
     $("body").click(function() { 
      alert(self.a); 
     }); 
    } 
}; 
+0

これは通常動作しますが、次の場合に失敗します:test.init.call(otherContext) – PatrikAkerstrand

+0

@マシン:真実ですが、なぜそれをやりたいのですか?オブジェクトの外部にある変数にアクセスするとうまくいくかもしれませんが、そうすることで深刻なスパゲッティにつながります。

 var test = { a: 3, init: function() { var self = this; $("body").click(function() { test.doit(); }); }, doit: function() { var self = this; alert(self.a); } }; 
が、私は今、これが動作しない、のdoIt機能を再利用する必要があります:このようなパターンは悪臭とみなされ、 – AnthonyWJones

+0

[OK]を可能なら避けるべきで、これは動作します「このよう

 var test = { a: 3, init: function() { var self = this; $("body").click(self.doit); }, doit: function() { var self = this; alert(self.a); } }; 
"doitでは$(" body ")objを参照しています。アイデア? –

0

[OK]を、この作品doit関数を呼び出すと、これは機能しません。

 

var test = { 
    a: 3, 
    init: function() { 
     var self = this; 
     $("body").click(self.doit); 
    }, 

    doit: function() { 
     var self = this; 
     alert(self.a); 
    } 

}; 
0

[OK]を、これが第二の問題が修正されています。

 
function test() { 
    var self; 
    return { 
     init: function() { 
      self = this; 
      $("body").click(this.doit); 
     }, 

     doit: function(data, b) { 
      alert(self.testing()); 
     }, 

     testing: function() { 
      return 4; 
     } 
    } 
} 


$(function() { 
    var x = test(); 
    x.init(); 
}); 

+2

あなたはSOFAQを読むことが考えられます。 SOがフォーラムやNGのように回答を追加しないでください。あなたの既存の答えを洗練してください。 – AnthonyWJones

2

は実は、私はこれを好む:それは自己設定だと初期化:

 

function createX() { 
    var self = { 
     init: function() { 
      $("body").click(this.doit); 
     }, 

     doit: function(data, b) { 
      alert(self.testing()); 
     }, 

     testing: function() { 
      return 4; 
     } 
    } 
    self.init(); 
    return self; 
} 


$(function() { 
    createX(); 
});