2012-08-14 20 views
5

içinde bu benim için daha doğru:“var” değişkenleri, "Bu" değişkenler ve "küresel" değişkenler - Benim son sorunun ardından bir JavaScript Oluşturucu

örnek:

function Foo() { 
    this.bla = 1; 
    var blabla = 10; 
    blablabla = 100; 
    this.getblabla = function() { 
     return blabla; // exposes blabla outside 
    } 
} 
foo = new Foo(); 

ne şimdi anlayın:

this.bla = 1;  // will become an attribute of every instance of FOO. 
var blabla = 10; // will become a local variable of Foo(will **not** become an attribute of every instance of FOO), which could be accessed by any instance of FOO - only if there's a method like "this.getBlabla". that's a "closer" ? 
blablabla = 100; // will define a **new** (or change if exist) global(window) variable. 

Doğru anlıyor muyum?

Ayrıca - var blabla = 10; ve yüklenici içinde kullanan getblabla işlevini eklerseniz, Foo ("foo" ...) öğesinin her örneği için, bunu içeren bellekte bir Foo yüklenici işlevi kaydedilir. "özel" değişken. ya da özel değişkenler için aynı Foo fonksiyonu olacak - TÜM örnekleri (foo gibi) Foo için?

+0

İlk üç iddianız doğru. Son sorduğun soruyu tam olarak takip etmiyorum. Açıklayabilir misin?Benzer şekilde adlandırılmamış değişkenleri de deneyebilir misiniz? Takip etmek zor. Teşekkürler. – Brad

+0

Bu benim için de karmaşık. Demek istediğim - bir kapanış, değil mi? ve bu bir müteahhit - yani, her bir Foo vakası için, anılarda Foo'nun yeni bir kapanışı olacak mı? Bu şeyler nasıl çalışır? Teşekkürler. – Daniel

cevap

6

değişkenler) Sonra, değişkenlerinize tekrar bağlayacağım.

var x = "Global scope"; 
var y = "Not changed."; 

function Foo() { 
    this.x = "Attribute of foo"; 
    var x = "In foo's closure"; 
    y = "Changed!" 
    this.getX = function() { 
     return x; 
    } 
} 

// do some logging 

console.log(x); // "Global scope" 
console.log(y); // "Not changed" 
foo = new Foo(); 
console.log(y); // "Changed!" 
console.log(foo.x); // "Attribute of foo" 
console.log(x); // "Global scope" 
console.log(foo.getX()); // "In foo's closure" 

hattı: this.xthis.bla eşdeğerdir, ve bu Foo nesnenin harici olarak mevcut özelliği tanımlar. y, blablabla=100 ile eşdeğerdir ve foo içindeki x, foo içinde blablabla eşdeğerdir. İşte gerçekten kaba bir jsfiddle bunu görmek için koşabilirsiniz.

1

Evet, anlıyorsunuz!
Sorunun ikinci kısmına gelince, tüm bunlar (küresel) pencere ile onun kapsamı içinde tanımlanan işlevler (düşünme kökü) arasındaki ilişki gibi kalıtımla ilgilidir. Yani, yeniden belirtmediğiniz her şey, ataya bakılacaktır.

Bu, Crockford'un iyi bir şekilde açıkladığı bir tremendous good video.

2

Söylediğiniz her şey doğru. (Elbette, bir hata Strict Mode içinde blablabla atama atılan edilecektir. İkinci yarıda On

, yapıcı işlevi hakkında özel bir şey yok. O sürece devam eden kapatma yaratır ki Sadece başka fonksiyonu gibi davranır . onun başvurulan (bu durumda this.getblabla ömrü) olarak

Bu örneği ele alalım:, Foo yapıcı bir kapatma oluşturmadığı İşte

function initBlaBla() { 
    var blabla = 10; 
    this.getblabla = function() { 
     return blabla; // exposes blabla outside 
    } 
} 

function Foo() { 
    this.bla = 1; 
    blablabla = 100; 
    initBlaBla.call(this); 
} 

foo = new Foo(); 

ve kapsamı derhal serbest alır initBlaBla diğer tarafta. han d bir kapanma oluşturur. İlginç bir şekilde, derleyici, blabla'nın hiçbir zaman 10'a dönüp asla kapanma kapsamını kaydetmemesi için this.getblabla'u hiçbir zaman yazıp optimize etmediğini görebilir. Bu, kapatmanın içindeki bir işlevde yürütmeyi kırıp, içsel olarak başvurmadığı bir değeri okumayı denediğinizde görülebilir.

kapatma kapsamı piyasaya alacak ve aşağıdakilerden herhangi birini ararsanız çöp toplama için sıraya: Ben daha net ile (bu örnekte üzerinden çalışmasını gidiyorum Sadece kapsam odaklanmak

delete foo.getblabla; 
foo.getblabla = "Anything!"; 
foo = "Anything else."; 
İlgili konular