2010-12-06 23 views
6

İşte "Javascript - The Good Parts" adlı çalışma örneğidir.işlev çağırma örüntüsü tanımlama kuralları JavaScript

function add(x, y){ return x + y}; 

var myObject = { 
    value: 0, 
    increment: function (inc) { 
     this.value += typeof inc === 'number' ? inc : 1; 
    } 
}; 

myObject.increment(2); 
document.writeln(myObject.value); 

myObject.double = function () { 
    var that = this; // Workaround. 

    var helper = function () { 
     that.value = add(that.value, that.value) 
    }; 

    helper(); // Invoke helper as a function. 
}; 

myObject.double(); 
document.writeln(myObject.value); // 4 

İşlev çağırma deseni için, 'bu' nesnesi genel referansa sahip olacaktır. Ama ben tam anlayamıyorum altında-luk söz Geçici çözümün: -

var that = this; // Workaround. 

Bunu yaparsak, biz sadece 'o' 'this' referansı kopyalama değildir? yani 'bu' küresel kapsamı 'bu' ile aynı tutacak mı? Bu nasıl dahili olarak çalışır?

cevap

2

Burada iki işlev yer almaktadır: biri myObject.double, diğeri helper. myObject.double()'u aradığınızda, bu myObject anlamına gelir. Yani that === myObject. Daha sonra, bu işlevin içinde, ayrıca helper()'u da arayın ve bu kapsamda this === the global object'a sahipsiniz.

10

Burada aynı değil, thismyObject böylece sahip olduğu doğru value özelliği alıyoruz atıfta this bunu yapıyor gibi referansı tutmak istiyorum neden olan ... window bakın olur. You can test it out here, helper işlevindeki birkaç uyarı, oldukça iyi olup bitenleri gösterir.

alternatif .call() veya .apply() doğru içeriğiyle fonksiyonu olacaktır, bu yüzden this böyle ... İstediğiniz myObject örneğine başvurmak için devam eder:

myObject.double = function() { 
    var helper = function() { 
     this.value = add(this.value, this.value) 
    }; 
    helper.call(this); // Invoke helper as a function. 
}; 

You can test that version here.

+0

+1 alternatif için – sojin

+1

Ayrıca, bahsi geçen kitapta (Javascript The Good Parts), önceki paragraf, "Yöntem Çağırma Kalıbı" ile ilgili açık bir şekilde açıklanmaktadır: Bir fonksiyon bir nesnenin bir özelliği olarak saklandığında bu bir yöntem. Bir yöntem çağrıldığında, bu, bu nesneye bağlıdır. ', Sizin durumunuzda' myObject.double = function() {...}; 'sizin Method Invocation Pattern'inizdir, bu yüzden içinde bulunduğunda, 'this'; myObject' –

+1

Dikkat edilmesi gereken diğer bir nokta: sağlanan örnek 'İşlev Çağırma Modeli' için' iç işlev 'işlevini kullanmaktadır. Mantığı göstermek için çok daha basit bir örnek oluşturdum, bkz. Http://jsbin.com/ciriwabeliwi/1/edit?js,console. Son olarak, kitap tarafından sağlanan örnek http://jsbin.com/roheyekonabe/1/edit?js ,console ile eşdeğerdir. –

İlgili konular