2012-11-22 13 views
6

Birisi bu işlevi açıklayabilir mi? Ben bind(Function.prototype.bind)bindbind() işlevini açıkla

+0

"bağlam" "thisValue" veya benzeri gibi daha iyi olacaktır. – RobG

+0

@RobG: "* içerik *" ile ilgili sorun nedir? Sık kullandım ve teknik terimden daha açıklayıcı olduğunu düşünüyorum. Benim için okuyacağımız bir bağlantı var mı? – Bergi

+0

ECMAScript'te, "içerik", [yürütme içeriği] ile ilgili olarak kullanılır (http://ecma-international.org/ecma-262/5.Yürürlükte olan kodun tüm parametrelerini ve kapsamını içeren 1/# sn-10). Bu 'bu' değerini içerir ve kodun nasıl yazıldığını kontrol eder. Statik. Tersine, bir fonksiyonun 'this' değeri dinamiktir ve fonksiyonun nasıl çağrıldığı ile tamamen ayarlanır, fonksiyonun nasıl ilan edildiğine veya intialised olduğuna dair bir şey yoktur. Yani "bu" bağlamı aramak uygun değildir. Bunu kullananların, kullandıkları dilin özelliklerini okumasına ve anlamasına ihtiyacı vardır. – RobG

cevap

4

Tamam halini sordum,

var bindedContextFunc = bindbind(function)(context); 
bindedContextFunc(args); 

Ama bu fonksiyonları oluşturma işlemini anlamıyorum:

var bindbind = Function.prototype.bind.bind(Function.prototype.bind); 

Ben üretmek sonucu anlıyoruz. Biz kimin (basitleştirilmiş) kodu burada üç kez Function.prototype.bind işlevi var

function bind(context) { 
    var fn = this; 
    return function() { 
     return fn.apply(context, arguments); 
    } 
} 

Ben kısmi uygulaması dolu bir daha işlevsel bir tarzda kısaltmak olacaktır: bağlamak fn (bağlam) -> fn bağlam.

Peki ne işe yarıyor? bind.call(bind, bind) var veya bağlama (bağlama) bağlamanız gerekir. Bunu bağlama ağına bağlamak için genişletelim. Ya şimdi ona bazı argümanlar sağlasaydık?

bağlama bağlanma (bağlama) (fn) (bağlama)

bağlama bağlanma(fn) (bağlama)

bağlama (bağlamda fn)

.210

FN'nin bağlam

İşte geldik.

bindbind = bağlamak bağlamak (bağlama)

bindfn = bindbind şey (fn) // bağlamak fn

: Biz sonuç daha net hale getirmek için bazı değişkenlere bu atayabilirsiniz contextbindfn = bindfn (içerik) // fn içerik

sonuç = contextbindfn şey (prmtr) // fn bağlam (prmtr)

+0

, aynı sonuca ulaşmak için, bu çözümün neden daha iyi olduğunu (ya da muhtemelen niçin var olduğunu sormalıyız), eğer fn.bind (bağlam) (args) 'ı yapabilirsek, detaylandırır mısınız? – asdf

+1

"bindfn" yi geri döndürmek isteyen bir api'ye sahip olduğunuzu varsayarsak, henüz bağlamı bilmez. Daha sonra, uzun - yani 'bindbind (fn)' olan 'Function.prototype.bind.bind (fn)' - işlevini kullanabilirsiniz. Gerçi, gerçek bir dünya uygulaması olup olmadığından emin değil. – Bergi