Diğer tüm cevaplar bazıları versiyonu olan "make bir kapatma ". Tamam, işe yarıyor. Ancak ...
Ben kapanışları serin düşünüyorum ve onları destekleyen diller serin şunlardır: IMO, bunu yapmanın bir daha temiz bir yolu yoktur. Basitçe neye ihtiyacınız depolamak için görüntü nesnesini kullanın ve "this
" üzerinden yük işleyicisinde erişmek:
imageObj = new Image();
imageObj.x = 1;
imageObj.y = 2;
imageObj.onload = function() {
context.drawImage(this, this.x, this.y);
};
imageObj.src = ".....";
Bu çok genel bir tekniktir ve ben DOM birçok nesnelerde o her zaman kullandıkları . (I varken Özellikle, diyelim ki, dört düğmeyi kullanmak ve tüm paylaşımına bir "onclick" işleyici onları istiyorum;. Ben işleyicisi var OLDUĞUNU düğmenin belirli eylem yapmak için düğmeye dışına özel verileri biraz çekin)
Tek uyarı: Nesne sınıfının kendisinin özel bir anlamı veya kullanımının bulunduğu bir özelliği kullanmamaya dikkat etmelisiniz. (Örneğin: herhangi bir eski özel kullanım için imageObj.src
kullanamazsınız; kaynak URL için onu bırakmak zorundasınız.) Ancak, genel durumda, belirli bir nesnenin tüm özelliklerini nasıl kullandığını nasıl bileceksiniz? Kesinlikle konuşamazsın. Yani mümkün olduğunca bu yaklaşım kadar güvenli hale getirmek için:
- nesnenin kendisi tarafından kullanılmak üzere/olağandışı olası değildir bir özellik itiraz tek bir nesne
- Ata tüm özel veriler paketle.
Bu bağlamda, bazı tarayıcılarda bazı Javascript uygulamalarının Image nesnesini kullanırken bu özellikleri kullanabileceğinden "x" ve "y" kullanımı biraz risklidir. Ama bu muhtemelen güvenlidir:
imageObj = new Image();
imageObj.myCustomData = {x: 1, y: 2};
imageObj.onload = function() {
context.drawImage(this, this.myCustomData.x, this.myCustomData.y);
};
imageObj.src = ".....";
Bu yaklaşıma diğer avantajı Sayısı: Belirli bir nesnenin bir sürü oluştururken eğer çok fazla bellek kaydedebilirsiniz - Şimdi Onload işleyicisi tek bir örneğini paylaşabileceğinden .
// closure based solution -- creates 1000 anonymous functions for "onload"
for (var i=0; i<1000; i++) {
var imageObj = new Image();
var x = i*20;
var y = i*10;
imageObj.onload = function() {
context.drawImage(imageObj, x, y);
};
imageObj.src = ".....";
}
Görüntü nesnesi gizlenmiş özel verilerinizin, paylaşılan-onload işleve karşılaştırın:: kapanışları kullanarak, bu düşünün
// custom data in the object -- creates A SINGLE "onload" function
function myImageOnload() {
context.drawImage(this, this.myCustomData.x, this.myCustomData.y);
}
for (var i=0; i<1000; i++) {
imageObj = new Image();
imageObj.myCustomData = {x: i*20, y: i*10};
imageObj.onload = myImageOnload;
imageObj.src = ".....";
}
Çok bellek kaydedilir ve değiller çünkü daha hızlı bir skosh çalıştırabilir tüm bu anonim işlevleri yaratmıyor. (Bu örnekte, onload fonksiyonu bir tek liner .... ama 100-line onload fonksiyonları vardı ve bunların 1000 tanesi kesinlikle iyi bir sebepten dolayı çok fazla bellek harcamayı düşünebilirdi.)
başka bir yol: imageObj.coords = {x: x, y: y}; ... drawImage (imageObj, imageObj.coords.x, imageObj.coords.y); – dandavis
COMP SCI TECHIE STUFF: Yukarıdaki problem, yük fonksiyonunun GLOBAL değişkenlerine x ve y ... atıfta bulunması ve çalıştırıldığında o andaki akım değerini kullanmasıdır. Bir kapamayı doğru şekilde kullanmak için - ve oluşturma değerlerinden (kapanışın) "kaydedilen" değişken değerlerine sahip olmak ve yürütülürken kullanıldığında, "var" beyanını, kapağın İÇERİĞİ kapsamına almak için kullanmanız gerekir. (Bu, eğer değişkenler bir işleve resmî parametrelerse, dolaylı olarak gerçekleşir, işte bu yüzden buradaki "burada" kapanış-temelli cevaplar budur.) –