SORU
31 AĞUSTOS 2008, Pazar


A 'Kapatılması nedir'?

Tımar hakkında bir soru sordum ve kapanışları bahsedildi. Kapatma nedir? Tımar nasıl bir ilişkisi var?

CEVAP
18 EYLÜL 2011, Pazar


Değişken kapsamı

Yerel bir değişken bildirdiğinizde, bu değişken bir kapsamı vardır. Genellikle yerel değişkenler, bunları bildirmek blok veya işlevi yalnızca içinde var.

function() {
  var a = 1;
  console.log(a); // works
}    
console.log(a); // fails

Eğer yerel bir değişken erişmek için çalışırsanız, çok dil kökü kapsamında ulaşana kadar geçerli kapsamda, üst kapsamları ile bakacaktır.

var a = 1;
function() {
  console.log(a); // works
}    
console.log(a); // works

Bir blok ya da işlevi ile bitince, yerel değişkenler artık gerekli ve genellikle bellek uçtu.

Bu normalde işler bekliyoruz.

Bir kapatma kalıcı bir yerel değişken bir kapsamı vardır

Bir kapatma kodu yürütülmesi blok dışına taşındı sonra bile yerel değişkenler için tutar olan kalıcı bir kapsamı vardır. Dil desteği kapatılması (gibi JavaScript, Hızlı ve Ruby) izin tutmak için bir başvuru için bir kapsam (dahil olmak üzere üst scopes), sonra bile blok bu değişkenler olduğunu ilan etti bitirdi yürütmek, sağlanan duruyorsun başvuru blok veya işlevi bir yerde.

Kapsam nesne, ve tüm yerel değişkenler işlev bağlıdır, ve bu işlevi devam ettiği sürece devam edecek.

Bu taşınabilirlik bize işlevini verir. Eğer tamamen farklı bir bağlamda işlevi ararsak bile işlevi ilk tanımlanan kapsamda tüm değişkenleri hala biz daha sonra işlev çağrısı kapsamında olmasını bekliyoruz biz.

Örneğin

İşte bu noktayı gösterir JavaScript çok basit bir örnek:

outer = function() {
  var a = 1;
  var inner = function() {
    alert(a);
  }
  return inner; // this returns a function
}

var fnc = outer(); // execute outer to get inner 
fnc();

Burada bir fonksiyon içerisinde bir fonksiyon tanımlıyorum. İç işlevi dış işlevin bütün yerel değişkenleri a da dahil olmak üzere erişim kazanır. 7* *değişken iç işlevi için kapsam.

Normalde bir işlevi, tüm yerel değişkenler darmadağın olup çıkar. Biz ancak, iç işlev döndürme ve atama bir değişken için outer çıktıktan sonra devam ederse fnc,,inner tanımlanan kapsam içinde tüm değişkenleri de geçerli. a -- kapatıldı değişken bir kapanma içinde.

12 ** değişken fnc tamamen özel olduğunu unutmayın. Bu JavaScript gibi fonksiyonel bir programlama dilinde özel değişkenler oluşturma bir yoludur.

Tahmin edebileceğini gibi fnc() diyorum ki a, değeri uyarıları "1".

Kapatma olmadan bir dilde, 16* *değişken işlev outer çıkıldığı zaman, çöp toplama ve çöpe atıldı. Fnc arama a artık yok, çünkü bir hata atardı

JavaScript, a değişken kapsamı işlevi ilk ilan oluşturulur çünkü kalır ve işlev olarak devam ederse değişken var olmaya devam ediyor.

a outer kapsamı aittir. inner kapsamı outer kapsamında üst bir işaretçi var. fnc 25* *gösteren bir değişkendir. a fnc devam ettiği sürece devam eder. a kapatılmasıyla.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • gsmaestro

    gsmaestro

    17 AĞUSTOS 2006
  • LimeFire

    LimeFire

    2 ŞUBAT 2012