2012-04-14 21 views
3

jQueryで変数へのアクセスについて簡単な質問があります。 'a'をクリックして読み込み関数を呼び出すと、変数(ラップ)にアクセスする方法がありますか?JQuery関数での変数の使用

(function() { 
    var Example= { 
     init: function() { 
      var wrap = 'hello world'; 
      $('a').on('click', this.read); 
     }, 

     read: function() { 
      console.log(wrap) 
     } 
    }; 

    Example.init(); 
})(); 

答えて

3

これを実現するには、いくつかの方法があります。おそらく最も簡単なのは、 'wrap'変数の範囲を変更することです。現在、init関数内のvarで宣言されているため、関数はinitになり、initの外部では直接使用できません。だから、あなたは(それが「例」オブジェクトのプロパティかもしれない)init外の「ラップ」を宣言することができます。

var Example= { 
     wrap: 'hello world', 
     init: function() { 
      var self = this; 
      $('a').click(function(){ 
       self.read(); 
      }); 
     }, 

     read: function() { 
      console.log(this.wrap); 
     } 
    }; 

    ​Exa​mple.init(); 

これは「ラップが」「例」と 'のプロパティとして利用可能にスコープます例 'の中で定義されているすべての関数を通して。

(編集:適切に閉鎖を処理するために、このビット微調整しなければならなかった)

+0

良い説明! –

+0

この種の構造でより多くの変数を管理するためのベストプラクティスはありますか?つまり、「hello world」というラップのようなものを追加するだけですか? – Matt

+0

それは本当にプロジェクトに依存します。私のオブジェクトは、私がオブジェクトの自然な部分であると思われるものであるプロパティと機能を持つ傾向があります。あなたのケースでは、 'wrap'が 'Example'オブジェクトのプロパティでなければならない変数であるかどうかを知るのは難しいです。例えば、 'wrap'が何か他のもの(例えば、自身を隠すか表示する)を必要とする場合は、おそらく自分のオブジェクトをラップして 'Example'(または他のオブジェクトがあるかもしれません)それ。しかし、 'wrap'が 'Example'が使用する文字列の場合は、 'Example'のプロパティとして残しておきます。 –

3
(function() { 
    var wrap; 
    var Example= { 
     init: function() { 
      wrap = 'hello world'; 
      $('a').on('click', this.read); 
    ... 

関数は、その定義スコープから見えるすべての変数へのアクセス権を持っているため。

+0

ありがとう、私のプロジェクトに多くのものが必要な場合は、このような変数? – Matt

+0

うん、あなたはあなたが好きなだけ多くを使用することができます。多くの関連変数(imageWidth、imageHeight、imageNameなど)がある場合は、それらをオブジェクトのプロパティ(image.width、image.heightなど)に渡すことをお勧めします。 – jimw

+0

作成できる: var cache = { var one = one var two = two} これはこれまでと同じ問題を引き起こしませんか? – Matt

-1

うん、これはそれを行う必要があります。

(function() { 
    var wrap; 
    var Example= { 
     init: function() { 
      var wrap = 'hello world'; 
      $('a').on('click', this.read); 
     }, 

     read: function() { 
      console.log(wrap) 
     } 
    }; 

    Example.init(); 
})(); 
+0

これはうまくいかないでしょう - あなたはthis.readを呼び出し、それを渡すことはありません。 – jimw

0
(function() { 
    var Example= { 
     init: function() { 
      this.wrap = 'hello world'; 
      $('a').on('click', this.read); 
     }, 
     read: function() { 
      console.log(this.wrap) 
     } 
    }; 
    Example.init(); 
})(); 
0

これを試してみてください(フィドルを:)を使用すると、暴露のモジュールパターンの使用を検討している場合

(function(){ 
    var Example= { 
     wrap:null, 
     init: function() { 
      this.wrap = 'hello world'; 
      $('a').on('click', this.read); 
     }, 

     read: function() { 
      console.log(Example.wrap) 
     } 
    }; 
    Example.init(); 
}​)();​ 
0

どの変数がプライベートで、どのような変数が公開されているかを定義することができます:

var Example = (function(){ 

    var wrap = 'hello world', 
     init = function(){ 
      ... 
     }, 
     read = function(){ 
      ... // You can use `wrap` here 
     }; 

    return { // Return public variables and methods 
     init: init, 
     read: read 
    }; 

})(); 

Example.init(); 
関連する問題