2009-03-04 10 views
0

現在の設定:グローバル変数ではなくJavascript Closureをここで使用できますか?

var placeId; 
function selectPlace(place) { 
    $('#selectPlace').html('Selected Place: <b>' + place.Name + '</b>'); 
    $('#map').hide(400); 
    placeId = place.Id; 
} 

$(document).ready(function() 
{ 
    $('#postMessage').click(function() { 
     alert("PlaceId: " + placeId); 
    }); 
}); 

は/私はクロージャを使用する必要がありますすることはできますか?それは、コンテキストに基づいて、行うには合理的なものと思われる

答えて

3

、それは何のように思えます探しているのはこれです:

これはクロージャを使用していないため、最後に割り当てられたIDが関数オブジェクトに格納されます。次に、関数をセッターとして使用しない場合は、値を返します。あなたが同じことを行うためにクロージャを使用したい場合は、上記の例のように多くなります:ところで

(function(){ 
    var placeId; 

    window.selectPlace = function(place) { 
    if(!place){ 
     return placeId; 
    }else{ 
     $('#selectPlace').html('Selected Place: <b>' + place.Name + '</b>'); 
     $('#map').hide(400); 
     placeId = place.Id; 
    } 
    } 
})(); 

、閉鎖を発見する最も簡単な方法は、関数がそれで変数を持っている場合であります現在の関数の中にvarと宣言されていませんが、内部にある他の関数に入っています。上記のように、変数placeIdselectPlace関数の内部で宣言されていません。つまり、selectPlace関数はplaceId変数を使用するクロージャです。

+0

非常にクールです。はい、私は閉鎖を必要としていなかったと推測しています。グローバルを使うのをやめようとしています(彼らは悪いと聞いていました)。なぜ私はこれを考えることができませんでしたが、それを追加していただきありがとうございます! – rball

+0

alert( "PlaceId:" + placeId())の代わりに;アラートを意味しましたか( "PlaceId:" + selectPlace()); – rball

6

、あなたは簡単にラ関数式を使用してコードを置き換えることによってそれを行うことができます:あなたのコメントに基づいて

(function(){ 
    var placeId; 
    // It looks like you want selectPlace to be a global function? 
    // hence i'm using assignment of a function expression here 
    selectPlace = function (place) { 
     $('#selectPlace').html('Selected Place: <b>' + place.Name + '</b>'); 
     $('#map').hide(400); 
     placeId = place.Id; 
    } 

    $(document).ready(function() 
    { 
     $('#postMessage').click(function() { 
      alert("PlaceId: " + placeId); 
     }); 
    }); 
})(); 
+0

私はちょうど私がそれを得るとは思わない(閉鎖)。私は基本的にvar placeIdを持たず、selectPlace()の代わりにplaceを返したいと思った。その代わりに。 – rball

+0

のような何か: selectPlace =機能(場所){ \t \t $( '#のselectPlace')HTML( '選択した場所:' + place.Name + '')。 \t \t $( '#map')。hide(400); \t \t戻り場所。 \t} $( '#1のpostMessage')をクリックします(関数(){ \t \t \t警告( "PlaceId:" + selectPlace()); \t \t}); – rball

+0

どちらがうまくいかない:P あなたの例が自分のコードよりも優れているかどうか分かりませんか?お尻のように聞こえないようにしようとはしませんが、私は本当に分かりません。私はjavascriptの人ではないので、この方法でどうやって助けてくれるのかよくわからないのですか? – rball

関連する問題