2010-12-28 10 views
31

, basit javascript çıktı (varsayılan olarak) şöyle:Neden (CoffeeScript ilave) javascript fonksiyonu sarıcı kullanır ".call (this)"

(function() { 
    var a; 
    a = 1; 
}).call(this); 

.call (this) ne yapar ve eklemek neden olurdu?

+0

Bize bu js'yi veren kodu da gösterebilir misiniz? –

+1

Tahminimce, tüm değişkenlerin varsayılan olarak yerel işlev (global değil) kapsamına sahip olması ve 'bu' aracılığıyla ana kapsama erişim vermesinin en basit yolu budur – miensol

+2

Bu, JS'nizin adının konulmasıyla ilgili mükemmel bir makaledir: http: //javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/ –

cevap

15

Bir işlev oluşturup, üst işlev/nesneler kapsamıyla kendini çağırıyor.

.Kall ve .apply, bir işlevi çağırmanın farklı yöntemleridir. Temel olarak, kendi kapsamı içinde a = 1 ayarı dışında hiçbir şey yapmayan bir işlev oluşturdunuz.

Javascript'te, her bir işlevin bir nesne olduğunu ve this'un geçerli nesne/işlev ile ilgili olduğunu fark etmeniz gerekir. .call(this) kullanmak, this işlevini geçersiz kılar ve işlevin aranan içeriğiyle değiştirir.

33

Derlenmiş CoffeeScript'in değişken adlar için kendi kapsamına sahip olduğundan emin olmanın bir yolu. Bu, verimlilik ve basitlik açısından yarar sağlar (oluşturduğunuz JavaScript'in diğer kod tarafından kullanılan değişkenlerde durmayacağını biliyorsunuz). CoffeeScript derleyicisine --bare (veya -b) seçeneği ile devre dışı bırakabilirsiniz.

call(this) nedeni fonksiyonları normal çevreleyen bağlamdan onların this nesneyi miras yok çünkü sadece, CoffeeScript o yerleştirmiş kapsamı ile aynı this sahip olmasını sağlamaktır.

+5

Bu kendiliğinden yürütme işlevinden nasıl farklıdır? Gibi: (işlev() { /* Kod */ })(); – qwertymk

+8

Kendiliğinden yürütme işlevi, tarayıcı bağlamında yüklenmediği zaman, bunun 'bu' kavramını kaybeder. Bazı CommonJS platformları, yüklenmiş dosyaları belirli bir '' 'ile değerlendirir. – jashkenas

+2

Değişken kapsam nedenlerini tam olarak anlıyorum, ancak bir verimlilik avantajının nasıl olduğunu merak ediyorum. Derleyicinin veya oluşturulan JavaScript'in verimliliğinden bahsediyor musunuz? –