SORU
1 ŞUBAT 2011, Salı


Javascript global değişkenler

bir değişkeni bildirmek arasında herhangi bir fark yoktur

var a=0;//1

ve bu şekilde

a=0;//2

ya

window.a=0;//3

küresel kapsam?

CEVAP
1 ŞUBAT 2011, Salı


Evet, pratikte genellikle büyük onlar değil ama iki fark var.

Üç ifadelerinizi açıkladı

var a=0;

...bir değişken oluştururdeğişken nesneglobal yürütme içeriği olan küresel nesne, tarayıcılar, yumuşatılmış window (ve bir DOM pencere nesne yerine genel bir nesne gibi olur olmayan tarayıcı uygulamaları). Sembol ** 16 yaşında, kendisi, aslında küresel bir özellik (pencere) kendisini işaret etmek için kullandığı nesne.

Tüm sonuç: silinemiyor window bir özellik oluşturur. Ayrıca kodun ilk satırından önce (bkz: "Zaman var olur" aşağıda). tanımlı değil

IE8 ve daha önce özelliği window oluşturulmaz unutmayınsayısız(for..in tablolarda görünmüyor). Internet Explorer 9, Chrome, Firefox, Opera, sayısız.


a=0;

...window nesne üzerinde bir özellik oluştururörtülü olarak. Normal bir özellik olarak silebilirsiniz. Tavsiye ederimdeğilbunu yaparken, kimseyi sonra kodunuzu okumak için belirsiz olabilir.

Ve ilginçtir, IE8 tekrar ve daha önceki bir özellik yarattısayısız(for..in tablolarda görünmüyor). Garip, özellikle de aşağıda.


window.a=0;

...window nesne üzerinde bir özellik oluşturur açıkça. Normal bir özellik olarak silebilirsiniz.

Bu özelliksayısız, IE8 ve daha önceki, ve diğer her tarayıcı üzerinde çalıştım.

Dördüncü bir yol

Henüz başka bir yolu bunu yapmak için, btw var:

this.a=0;

..., this global yürütme içeriği başvuruları nedeniyle küresel nesne. Yani this.a=0; aynı window.a=0; (dışında olabilir, sonra da hiçbir şey, hiçbir şey daha hızlı çünkü this olmak zorunda değil baktı; muhtemelen imkansız ölçmek için herhangi bir gerçek dünya senaryo).

Bu window.a=0;, ile aynı olduğu için, bu sayısız bir özellik (hatta ve aşağıda IE8) oluşturur sürpriz değil.


Özellikler siliniyor

Ben ne demek "silme" mi? Tam olarak bu özellik Çıkarma (tamamen) delete anahtar kelime):

window.a = 0;
display("'a' in window? "   ('a' in window)); // displays "true"
delete window.a;
display("'a' in window? "   ('a' in window)); // displays "false"

delete tamamen bir nesneden bir özelliği kaldırır. Yapamazsın bunu özellikleri eklendi window dolaylı olarak) var delete ya da sessizce göz ardı ya da bir istisna atar (bağlı olarak JavaScript uygulaması ve ister misin katı modda).

UyarıInternet Explorer için izin verilmelidir bile window nesnenin özelliklerini silmek izin vermez. Daha da kötüsü, bir atarözel durum(diğer tarayıcılarda IE vetry this experiment) deneyin. window nesne silinirken, savunmaya geçmek zorunda:

try {
    delete window.prop;
}
catch (e) {
    window.prop = undefined;
}

Bu özelliği silmek için çalışır, ve eğer bir özel durum yoksa, bir sonraki en iyi şeyi yapar ve undefined ayarlar özelliği.

Busadecewindow nesne için geçerlidir ve sadece (bildiğim kadarıyla) YANİ. Diğer tarayıcılar window özellikleri, kuralları yukarıda konu silme konusunda gayet iyi.


var durumda

var sürüm ve diğerleri arasında bir fark var. Sembolü oluşturulduğunda ilgilidir. Semboller var deyimi ile tanımlanan önce oluşturulurherhangi biryürütme bağlamında adım adım kod çalıştırmak ve özelliği de varöncevar deyim.

Bu kafa karıştırıcı olabilir, bir göz atalım:

display("foo in window? "   ('foo' in window)); // displays "true"
display("window.foo = "   window.foo);          // displays "undefined"
display("bar in window? "   ('bar' in window)); // displays "false"
display("window.bar = "   window.bar);          // displays "undefined"
var foo = "f";
bar = "b";
display("foo in window? "   ('foo' in window)); // displays "true"
display("window.foo = "   window.foo);          // displays "f"
display("bar in window? "   ('bar' in window)); // displays "true"
display("window.bar = "   window.bar);          // displays "b"

Live example

Gördüğünüz gibi, 49* *sembol ama bar değil sembolü ilk satırın önce tanımlanır. Nerede var foo = "f"; deyim, orada gerçekten iki şey: tanımlama sembolü, hangi olmadan önce ilk satır kod çalıştırmak; bir atama için bu sembol, hangi gerçekleştiği hat olduğunu adım adım akış. (Poor misunderstood var)


Konu dışı: window yığılan Kaçının

window nesne özellikleri ile çok çok curcuna oluyor. Mümkün olduğunda, şiddetle karışıklık ekleyerek öneririz. Bunun yerine, küçük bir paket içinde semboller sarın ve ihracatenwindow bir sembol nesne. (Ben sık sık verme sakınherhangi birwindow nesne simgeler.) Simgeler kontrol altına almak için tüm kodunuzu içeren bir fonksiyonunu kullanabilirsiniz, Bu fonksiyon Eğer isterseniz anonim olabilir:

(function() {
    var a = 0; // `a` is NOT a property of `window` now

    function foo() {
        alert(a);   // Alerts "0", because `foo` can access `a`
    }
})();

Bu örnekte, bir fonksiyon tanımlamak ve hemen (sonunda ()) çalıştırılmış.

Fonksiyon bu şekilde sık sık kullanılan bir denirölçüm fonksiyonu. Fonksiyonlar ölçüm fonksiyonu içinde tanımlı oldukları için değişkenleri ölçüm işlevi tanımlı erişebilirsinizkilitlerbu veri (bkz: Closures are not complicated).

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Digital Bounds

    Digital Boun

    19 Temmuz 2013
  • JayzTwoCents

    JayzTwoCents

    26 AĞUSTOS 2012
  • TotalxLuna

    TotalxLuna

    27 Kasım 2011