هل يمكنني استخدام جافا سكريبت الإغلاق هنا بدلا من متغير عمومي؟

StackOverflow https://stackoverflow.com/questions/609023

  •  03-07-2019
  •  | 
  •  

سؤال

والإعداد الحالي:

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

ويمكن / يجب أن يكون باستخدام الإغلاق؟

هل كانت مفيدة؟

المحلول

وبناء على تعليقاتكم، ويبدو أن ما كنت تبحث عن هذا:

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 المخصصة الماضي على الكائن وظيفة. ثم كنت إرجاع قيمة إذا لم يكن لاستخدام وظيفة كصانعة. إذا أردت استخدام إغلاق للقيام بنفس الشيء، فإنه ينظر كثيرا كما في المثال أعلاه:

(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.

نصائح أخرى

ويبدو أمرا معقولا القيام به، على أساس السياق، يمكنك بسهولة أن تفعل ذلك عن طريق استبدال الشفرة مع تعبير وظيفة على غرار:

 (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);
         });
     });
 })();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top