2011-11-11 6 views
1

私はjQuery変数スコープが関数呼び出しを過ぎましたか?

function update_prices(product_selector){ 
    //kind of a hack to account for the sometimes having a professional price and sometimes not 
    var price_count = product_selector.find('small.rt').length; 
    for (i=0;i<=price_count;i++) 
    { 
     if(i == 0){ 
      var standard_selector = product_selector.find('small.rt:eq('+ i +')'); 
      var standard_price = standard_selector.attr('data'); 
     } 
     if(i == 1){ 
      var business_selector = product_selector.find('small.rt:eq('+ i +')'); 
      var business_price = business_selector.attr('data'); 
     } 
     if(i == 2){ 
      var professional_selector = product_selector.find('small.rt:eq('+ i +')'); 
      var professional_price = professional_selector.attr('data'); 
     } 
    } 
} 

この機能を持っていると私は私の質問は、私が作成されます三つの変数standard_selectorbusiness_selectorprofessional_selectorのためのスコープを保つ行う方法です

.... 
.... 
product_selector.find(".active_selector").removeClass('active_selector'); 
update_prices(product_selector); 
.... 
.... 

standard_selector.text("something"); 
business_selector.text("something else"); 
professional_selector.text("another thing"); 

それを呼び出すコードのこの塊を持っていますupdate_prices関数内

+0

update_prices()関数の外部にある変数にアクセスしたいのですか? – maxedison

+1

配列またはオブジェクトとして返し、関数呼び出しからそれらを取得します。 – Blazemonger

+0

はい関数呼び出しの直後にあります – Trace

答えて

5

これらの変数を関数宣言の後に保持するには、次の選択肢があります。

  1. これらは、必要な期間にわたって持続する上位レベルのスコープで宣言する必要があります。
  2. これらは、Webページの存続期間中持続するグローバル変数である必要があります。
  3. これらのオブジェクトは、目的の期間持続するオブジェクトのプロパティとして割り当てる必要があります。これは、これらの値を持つオブジェクトを関数から返すか、またはプロパティを設定できる関数にオブジェクトを渡すか、プロパティを配置するグローバルオブジェクトを持つことによって実行できます。

最も簡単な解決策は、(必ずしもベストではないと思った)高い範囲でそれらを宣言し、あなただけの代わりに、グローバル変数上で動作しているように、関数の中で彼らの前にvarを除去することによって、それらをグローバル変数を作ることです

// declare global variables in global scope 
var standard_selector; 
var business_selector; 
var profession_selector; 

function update_prices(product_selector){ 
    //kind of a hack to account for the sometimes having a professional price and sometimes not 
    var price_count = product_selector.find('small.rt').length; 
    for (i=0;i<=price_count;i++) 
    { 
     if(i == 0){ 
      standard_selector = product_selector.find('small.rt:eq('+ i +')'); 
      var standard_price = standard_selector.attr('data'); 
     } 
     if(i == 1){ 
      business_selector = product_selector.find('small.rt:eq('+ i +')'); 
      var business_price = business_selector.attr('data'); 
     } 
     if(i == 2){ 
      professional_selector = product_selector.find('small.rt:eq('+ i +')'); 
      var professional_price = professional_selector.attr('data'); 
     } 
    } 
} 

それとも、あなたはちょうどあなたがスコープ内にあるレベルにそれらを使用することができますので、この機能からそれらを返すようにしたい場合は、あなたがオブジェクトでそれらを返すことができます::

function update_prices(product_selector){ 
    //kind of a hack to account for the sometimes having a professional price and sometimes not 
    var sel = {}; 
    var price_count = product_selector.find('small.rt').length; 
    for (i=0;i<=price_count;i++) 
    { 
     if(i == 0){ 
      sel.standard_selector = product_selector.find('small.rt:eq('+ i +')'); 
      var standard_price = standard_selector.attr('data'); 
     } 
     if(i == 1){ 
      sel.business_selector = product_selector.find('small.rt:eq('+ i +')'); 
      var business_price = business_selector.attr('data'); 
     } 
     if(i == 2){ 
      sel.professional_selector = product_selector.find('small.rt:eq('+ i +')'); 
      var professional_price = professional_selector.attr('data'); 
     } 
    } 
    return(sel); 
} 

var selectors = update_prices(xxx); 
// access selectors.standard_selector, selectors.business_selector, selectors.profession_selector here 
+0

...しかし、私が知る限り、これらの変数をグローバルに格納する理由はありません。 – Blazemonger

+1

この質問には、これらの変数がグローバルに必要かどうか、またはスコープアップのレベルが1つだけ必要かという文脈情報はありません。私はちょうどそれらの変数を維持する方法の質問に答えることを試みた。だから私はすべての拠点をカバーする3つのオプションを提供し、OPはシナリオに最適なオプションを選択することができます。 – jfriend00

+0

質問の性質を考えれば、OPは経験豊富なJS開発者ではなく、それほど良く分かっていないと安全に推測できると思います。 ;-) – Blazemonger

4
使用してローカル変数の

オブジェクトとして返す

function update_prices(product_selector){ 
    ... 
    return {standard_selector:standard_selector, business_selector:business_selector, professional_selector} 
} 

var r = update_prices(product_selector); 
r.standard_selector.text("something"); 
r.business_selector.text("something else"); 
r.professional_selector.text("another thing"); 
関連する問題