我可以在这里使用Javascript Closures而不是全局变量吗?

时间:2009-03-04 02:15:03

标签: javascript closures

当前设置:

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 个答案:

答案 0 :(得分: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);
         });
     });
 })();

答案 1 :(得分:3)

根据您的评论,您似乎正在寻找的是:

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

这不是使用闭包,它只是将最后分配的ID存储在函数对象上。然后,如果他们不将该函数用作setter,则返回该值。如果你想使用一个闭包来做同样的事情,它看起来很像上面的例子:

(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变量的闭包。 / p>