SORU
21 EYLÜL 2008, Pazar


JavaScript kilitler nasıl çalışır?

Eskisi gibi 39* said*:

Eğer eski bir altı açıklarsın Eğer, gerçekten kendinizi anlamıyorum.

Peki, 27 yaşında bir arkadaş için JavaScript kapatma açıklamaya çalıştım ve tamamen başarısız oldu.

Nasıl kilitler (örneğin, fonksiyonlar, değişkenler ve benzeri), ama kilitler anlamıyor kavramların bilgisi olan biri açıklasın kendilerini misin?

Yığın Taşması verilen the Scheme example gördüm, ve yardımcı olmadı.

CEVAP
21 EYLÜL 2008, Pazar


Başka bir işlev içinde işlev sözcüğünü gördüğünüzde, iç işlevi dış fonksiyon değişkenleri erişimi vardır.

function foo(x) {
  var tmp = 3;

  function bar(y) {
    alert(x   y   (  tmp)); // will alert 16
  }

  bar(10);
}

foo(2);

Bu her zaman 16, bar foo, bağımsız değişken olarak tanımlanan x erişim ve aynı zamanda tmp erişebildiğinden foo uyaracaktır.

Bubir kapatma. Bir işlevi yokdönüşkapanışı olarak da adlandırılan olabilmek için.Sadece acil sözlü kapsamı dışında değişkenleri erişim bir kapatma oluşturur.

function foo(x) {
  var tmp = 3;

  return function (y) {
    alert(x   y   (  tmp)); // will also alert 16
  }
}

var bar = foo(2); // bar is now a closure.
bar(10);

Yukarıdaki işlevi de 16, bar x bakın çünkü artık doğrudan kapsamı içinde olmasına rağmen tmp, uyaracaktır.

tmp hala buralarda bar'nin kapatılması, ayrıca artan ediliyor. içinde asılı olduğundan, bar Ara her zaman artan olacak.

Kapatma en basit örnek bu

var a = 10;
function test() {
  console.log(a); // will output 10
  console.log(b); // will output 6
}
var b = 6;
test();

JavaScript bir fonksiyon çağrıldığında, yeni bir yürütme içeriği oluşturulur. İşlev bağımsız değişkenleri ve ayrıca tüm değişkenleri dışında ilan alır bu üst nesne ile birlikte (yukarıdaki örnekte, her ikisi de 'a' ve 'b').

Birden fazla kapatma işlevi oluşturmak için genel değişkenler için onları ayarlayarak, onlara bir listesini döndürerek ya. Tüm bunlar için başvuracaktıraynıx ve aynı 25**, kendi kopyalarını yapmıyorlar.

Burada 26* *numarasını değişmez bir sayıdır. foo çağrıldığında, JavaScript, diğer rakamları ile, 28 ** sayısıdırkopyalananbağımsız x foo.

Öte yandan, her zaman JavaScript nesneleri ile ilgili başvurular kullanır. Eğer ki, bir nesne ile foo arasaydın, döner kapatılmasıbaşvuruorijinal nesne!

function foo(x) {
  var tmp = 3;

  return function (y) {
    alert(x   y   tmp);
    x.memb = x.memb ? x.memb   1 : 1;
    alert(x.memb);
  }
}

var age = new Number(2);
var bar = foo(age); // bar is now a closure referencing age.
bar(10);

Beklendiği gibi, bar(10) her arama artışla 34**. x sadece age değişken aynı nesneyi bahsediyor olması beklenen olmayabilir, ne olur! bar, age.memb birkaç telefon görüşmesi olacak sonra 2! Bu başvuru, HTML nesneleri bellek sızıntısı için temel oluşturur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blunty

    Blunty

    13 Mart 2006
  • guillaume2111's channel

    guillaume211

    19 Kasım 2006
  • Kiddyzuzaa

    Kiddyzuzaa

    25 ŞUBAT 2014