isimsiz bir işlev JavaScript sınıfını gömmek Neden () diyoruz?

oy
17

Aradım Microsoft'tan yeni JavaScript benzeri dil hakkında okuyordu typescript . Olarak oyun (örnek bölümü) , JavaScript koduna dönüştürülen typescript sözdiziminde basit bir sınıfı bulunmaktadır. Beni yazılardan derlenmiş nesne yönelimli programlama JavaScript nasıl yapıldığını öğrenmek için bir Java programlama arka plandan geliyor, bu ilginçti.

Typescript kodu:

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return Hello,  + this.greeting;
    }
}   

var greeter = new Greeter(world);

var button = document.createElement('button')
button.innerText = Say Hello
button.onclick = function() {
    alert(greeter.greet())
}

document.body.appendChild(button)

Ve eşdeğer JavaScript kodu:

var Greeter = (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return Hello,  + this.greeting;
    };
    return Greeter;
})();
var greeter = new Greeter(world);
var button = document.createElement('button');
button.innerText = Say Hello;
button.onclick = function () {
    alert(greeter.greet());
};
document.body.appendChild(button);

Anlıyorum böylece typescript parçası Java çok benzer. JavaScript vücut Şimdi neden benim sorum Greetersınıfın anonim bir gömülü olduğu function()çağrı?

Neden bu gibi yazmak?

function Greeter(message) {
    this.greeting = message;
}
Greeter.prototype.greet = function () {
    return Hello,  + this.greeting;
};

Her bir yöntemin avantajı / dezavantajı nedir?

Oluştur 02/10/2012 saat 15:27
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
14

Bir denir aşağıdaki Hemen çağrılan Fonksiyon İfade :

(function(){ ... })();

Temiz küresel kapsamını tutmak için kullanılır. Dönüş değeri bir değişkene atanır beri rağmen, bu durumda gerekli değildir Greeter. Eğer "Özel" istediğinizde bu model kullanışlıdır tek zaman statik üyeler.

Örneğin:

var Greeter = (function () {
    var foo = 'foo', bar = 'bar'; /* only accessible from function's defined
                                     in the local scope ... */

    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    return Greeter;
})();
Cevap 02/10/2012 saat 15:30
kaynak kullanıcı

oy
3

bariz kapsam / kapama muhakeme yanında. hemen ön yük (yorumlayan) sınıf tanımı kendini çağıran bir anonim işlev kullanılması. Bu, herhangi bir tam zamanında optimizasyonlar ön dosyası içinde yüklenmesine olanak sağlar. Daha büyük, daha karmaşık uygulamalar için, Kısacası performansı artıracaktır.

Cevap 02/10/2012 saat 15:44
kaynak kullanıcı

oy
2

Bu özel üyeler için olanak sağlamaktır. senin iki yapılar eşdeğerdir Bu örnekte, tüm üyeler kamuya açıktır. Eğer özel üyeleri için sağlamak isterseniz Ancak, bir kapatma yoluyla çağıran kapsamından bunları gizlemek gerekir. Böylece şöyle özel üyesi varsa:

class Greeter {
    private greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
} 

Muhtemelen böyle bir şey alacağı:

var Greeter = (function () {
    var greeting="";
    function Greeter(message) {
        greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + greeting;
    };
    return Greeter;
})();

tebrik değişken anonim işlevi içinde tanımlanan herhangi bir fonksiyon kullanılabilir, ancak başka her yerde görünmez olur.

Cevap 02/10/2012 saat 15:36
kaynak kullanıcı

oy
2

anonim işlev / öz yürütme kapatma genellikle sadece döndürülen değer bunun dışında erişilebilir olacak şekilde kapsamını saklanması için kullanılır. (Ya da ne pencere gibi, diğer nesnelere takmak)

Cevap 02/10/2012 saat 15:31
kaynak kullanıcı

oy
1

anonim işlev muhtemelen orada kodun diğer bölümleriyle adı collition önlemektir. Şöyle düşünün, anonim işlevi içinde, hatta ne istersen olmak "$" adlı bir değişken olduğuna dair karar, ve aynı zamanda, çatışma olmadan kod diğer bölümlerinde jQuery kullanıyor.

Cevap 02/10/2012 saat 15:31
kaynak kullanıcı

oy
-4

kapatma parametrelerle kurucular aramaya tek ortalamasıdır:

var w = new Greeter("hello")

Orada diğer yöntemlerdir ancak tüm sınırlamalar ve sakıncaları ile komplike ve.

Cevap 18/07/2014 saat 09:13
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more