هل يمكنني استخدام جافا سكريبت الإغلاق هنا بدلا من متغير عمومي؟
-
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);
});
});
})();