Могу ли я использовать здесь Javascript Closures вместо глобальной переменной? - PullRequest
0 голосов
/ 04 марта 2009

Текущая настройка:

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);
    });
});

Можно / нужно ли использовать крышки?

Ответы [ 2 ]

6 голосов
/ 04 марта 2009

Кажется разумным сделать это, исходя из контекста, вы можете легко сделать это, заменив свой код на выражение функции а-ля:

 (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);
         });
     });
 })();
3 голосов
/ 04 марта 2009

Судя по вашим комментариям, кажется, что вы ищете вот что:

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

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

Это не использует замыкание, оно просто сохраняет последний назначенный идентификатор объекта функции. Тогда вы бы вернули значение, если они не используют функцию в качестве установщика. Если бы вы хотели использовать замыкание для того же, это выглядело бы как в примере выше:

(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 внутри текущей функции, но были в какой-то другой функции, внутри которой она находится. Как вы можете видеть выше, переменная placeId не объявлена ​​внутри функции selectPlace, что означает, что функция selectPlace является замыканием, использующим переменную placeId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...