2011-03-06 17 views

cevap

77

Harmen cevabı oldukça iyidir, ama bana bu CoffeeScript derleyici ve neden yapılır nerede konuda ayrıntıya edelim.

(function() { 
    ... 
}).call(this); 

Neden olmalarıdır: coffee -c foo.coffee ile bir şeyler derlerken

, her zaman bu gibi görünen bir foo.js alacak? Eh, sen foo.coffee içinde

x = 'stringy string' 

gibi bir atama koymak varsayalım. o gördüğünde, derleyici sorar: x zaten bu kapsamda, ya bir dış kapsamda var mıdır? Değilse, JavaScript çıkışında o kapsamda üst kısmında bir var x deklarasyon koyar.

Şimdi, bar.coffee içinde

x = 42 

yazma hem derlemek ve dağıtım için bar.js ile foo.js bağlamak herhalde.Sen

(function() { 
    var x; 
    x = 'stringy string'; 
    ... 
}).call(this); 
(function() { 
    var x; 
    x = 42; 
    ... 
}).call(this); 

Yani foo.coffee içinde x ve bar.coffee yılında x birbirinden tamamen izole olan alırsınız. Bu, CoffeeScript'in önemli bir parçasıdır: Değişkenler, dışa aktarılmadıkça (paylaşılan bir globale eklenerek veya Node.js'de exports) hiçbir zaman bir .coffee dosyasından diğerine sızmaz.

-b ("bare") bayrağını coffee'a göre geçersiz kılabilirsiniz, ancak bu yalnızca çok özel durumlarda kullanılmalıdır. Yukarıdaki örnekle kullandıysanız, elde edeceğiniz çıktı

Bu çok ciddi sonuçlara yol açabilir. Bunu kendiniz test etmek için foo.coffee'a setTimeout (-> alert x), 1 eklemeyi deneyin. İki JS dosyasını kendiniz birleştirmeniz gerekmediğine dikkat edin; bunları bir sayfaya eklemek için iki ayrı <script> etiketi kullanırsanız, bunlar hala tek bir dosya olarak çalışır.

Farklı modüllerin kapsamlarını izole ederek, CoffeeScript derleyici, projenizdeki farklı dosyaların aynı yerel değişken adlarını kullanıp kullanamayacağını endişelendirmenin baş ağrısından kurtarır. Bu, JavaScript dünyasında yaygın bir uygulamadır (bkz. Örneğin, jQuery source, ya da hemen hemen herhangi bir jQuery eklentisi) —CoffeeScript sizin için sadece bununla ilgilenir.

+1

Mükemmel strateji! – lo5

+4

Cevabınız iyi yazılmış ve gerçekten CoffeeScript'i (ve JavaScript'i) daha iyi anlamama yardımcı oluyor ... teşekkürler! –

+1

heck, küresel değişkenlerle böyle oynar? Sınıfsız veya kapanışsız bir şey yapmayı düşünmezdim. açıkça ihracat yapmak iğrenç. – Duke

19

bu yaklaşım hakkında iyi bir şey özel değişkenleri oluşturur, yani değişken adları ile herhangi bir çelişki olmayacak:

(function() { 
    var privateVar = 'test'; 
    alert(privateVar); // test 
})(); 

alert(typeof privateVar); // undefined 

.call(this) eklenmesi this anahtar kelime aynı değeri olarak ifade yapar Bu işlevin dışında başvurdu. o eklenmezse, this kelime otomatik genel nesneyi ifade edecektir. farkı göstermek için

küçük bir örnek aşağıdaki gibidir: Bu, benzer sözdizimi

function coffee(){ 
    this.val = 'test'; 
    this.module = (function(){ 
    return this.val; 
    }).call(this); 
} 

var instance = new coffee(); 
alert(instance.module); // test 

function coffee(){ 
    this.val = 'test'; 
    this.module = (function(){ 
    return this.val; 
    })(); 
} 

var instance = new coffee(); 
alert(typeof instance.module); // undefined 
+0

İyi cevap. Yardım ettiğin için teşekkür ederim! –

1

: hemen bir fonksiyonu olarak adlandırılır

(function() { 

}()); 

. Fonksiyon hemen tanımlanır ve çalıştırılır. Buna lehte bu blokunun içinde tüm kodu yerleştirmek ve böylece genel ad kirliliğini azaltmak, tek bir küresel değişkene işlevi atayabilirsiniz olmasıdır. İşlev içinde güzel bir kapsam sağlar. başkası herhangi biliyorsa

var MY_MODULE = (function() { 
    //local variables 
    var variable1, 
     variable2, 
     _self = {}, 
     etc 

    // public API 
    _self = { 
     someMethod: function() { 

     } 
    } 

    return _self; 
}()); 

emin eksileri tam ne olabileceğini, onlardan öğrenmek için mutlu olurdu:

Bu modül yazarken i kullanmak tipik kalıptır.

+0

Eksileri olduğunu söyleyebilirim 1) modüller arasında durumu paylaşmak için biraz daha zor çalışmak zorundasınız (en azından CoffeeScript'te, JavaScript'te, 'var' kelimesini atlayabilirsiniz, ancak bu genellikle jsLint tarafından engellenir) ve 2) ekstra işlev çağrısı ve bayttan küçük bir yük var. Ama zamanın% 99'u, ekstra güvenlik buna değer. –

+0

nope, bu bir cevap değil. örnek olarak (function() {}) 'i (özellikle) çağırır (örnek) (function() {})(). Harmen'in cevabı meseledir. –

İlgili konular