2016-04-01 26 views
0

Birkaç benzer soru bulabildim ancak içeride verilen yanıtların karışıklığımı tamamen atmadığını hissediyorum.Değişken kapsamını denetleme

jQuery ile oynarken bu soruya rastladım, ama sanırım jQuery'ye özgü bir JS sorusu daha var.

Aşağıdaki örnekte, tanımlamak istediğim bu değişkenler global olmak için iyi bir aday olabilirler, birkaç fonksiyonun dışında geniş kapsamlı bir kullanıma sahipler, ancak maruz kalmayı sınırlamak istediğimi hissediyorum.

$(function() { 
    $containers = $('.container'); 
    $childContainer = $('#childContainer'); 
    //Removed extra code 
    var $aButton = $('#childButton'); 
    //Removed extra code 

    $containers.hide(); 

    $childContainer.show(400); 

    $aButton.on('click', clickChildButton); 
    //Removed extra code 
}; 

function clickChildButton() { 
    $containers.hide(400); 
    $childContainer.show(400); 
} 

Çeşitli kapsayıcıları gösteren/gizleyen çeşitli düğmelerim olacaktır. Her durumda, $containers değişkeninin gizlenmesini sağlamak için diğer işlevlere görünmesi gerekir.

Genel değişkenler kullanmalı mıyım (veya belki de genel bir nesne kesmek için bir ad kullanılıyorsa) veya $containers değişkeninin kapsamını sınırlayabilmem için başka bir yol var mı? Ben onlar biraz daha karmaşık almaya başlamak (ve clickChildButton fonksiyonu gösterilen sadece iki satır daha içerecek şekilde gidiyoruz gibi tıklama olayları işlemek için anonim işlevlerini kullanarak üzerinde çok meraklı değilim

.

Not Bu özel örnekte kodu refactor ve hideContainers fonksiyonunu oluşturmak için daha iyi olabilir, ama yerine bu özel örnekte daha genel olarak değişkenlerin kapsamını nasıl kontrol edileceği daha çok ilgileniyorum

Teşekkür

+0

'Ben global' edilecek iyi bir aday olacağını tanımlamak isteyen bu değişkenler aşağıdaki örnekte olduğu gibi hissediyorum - mümkün ve tercihen hiçbiri olduğunca az Global'in sahip olmalıdır. Küresel bir şey ortaya çıkarmanız gerekiyorsa, bir ad alanı değişkeni (bir nesne) ortaya çıkarın ve bu ad alanından tüm diğer * globals * 'ı kapatın. Kapsamı sınırlamanın en iyi yolu, her şeyi bir 'IIFE'de sarmak ve' var '- voila - no globals'ı kullanmaktır. – Adam

+0

@Adam: Yorumunuz için teşekkür ederim, söylediğin şeyin böyle olabileceğinden şüpheleniyorum. Buradaki yorumunuza ve Amadan'ın yorumuna dayanarak IIFE rotasını aşağıya ineceğim. – BadAtMaths

cevap

1

yılında. JavaScript (ES6'dan önce), tüm değişkenler fu nction-kapsamlı. Sonuç olarak, bir değişkeni kapsamamanın tek yolu onu bir işlev için yerel yapmaktır.

Burada iki temel seçeneğiniz var. aslında daha geniş ama çok geniş olması kapsamını gerekiyorsa

, başka bir seçenek
$(function() { 
    var $containers, $childContainer; 

    function clickChildButton() { 
    $containers.hide(400); 
    $childContainer.show(400); 
    } 
    ... 
}); 

bir içine her şeyi sarmak için: o alakalı tek yerdir olarak biri $(function(...) {...}) yerel clickChildButton yapmaktır Hayatta:

(function() { 
    $(function() { 
    ... 
    }); 
    function clickChildButton() { 
    .... 
    }); 
)(); 
+0

Teşekkürler, aradığım şey buydu. Sanırım IIFE rotasına ineceğim. Dikkat etmem gereken bir şey var mı? – BadAtMaths

+0

Pek değil, hayır. '' Var '' un unutmadan kaçınmak için '' kullanın '' kullanın, bu daha fazla ya da daha azdır. Ayrıca, ES6 yaygın olarak kullanılabilir hale geldiğinde, '' var'dan daha hassas bir kapsam belirleyelim. – Amadan