2011-02-06 25 views
6

Olası Çoğalt konak fonksiyonunu başvurulması:
JavaScript function aliasing doesn't seem to workJavaScript: Yerel değişkeni yoluyla

neden değil bu iş? Firefox'ta Uncaught TypeError: Illegal invocation
... ve:

function foo() { 

    var g = document.getElementById; 

    g('sampleID'); 

} 

Bu hata Chrome'da atılır Error: uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object" olsa IE9 beta çalışır

!!

Gösteri:http://jsfiddle.net/ugBpc/

+0

olası yinelenen http: // stackoverflow. com/questions/1007340/javascript-function-aliasing-doesnt-work-to-work) –

+0

Denediniz mi? g.call (document, 'sampleID'); '?? – Pointy

+0

@Pointy Hayır, daha önce düşünmedim :) –

cevap

5

çok tarayıcı document.getElementById yöntem orijinal nesnenin (document) bağlamında adı gerektirir. Yani bu işe yarar: Bu ancak, Internet Explorer 7 ve alt başarısız olur

function foo() {  
    var g = document.getElementById;  
    g.call(document, 'sampleID'); 
} 

, DOM yöntemleri Function.prototype devralan yok çünkü. Orijinal örneğiniz, Internet Explorer'ın tüm sürümlerinde çalışmalıdır.

Ayrıca bunu destekleyecek veya nereye compatibility implementation sağladı tarayıcılarda, Function.prototype.bind kullanabilirsiniz: ([çalışmaya görünmüyor JavaScript işlevi aliasing] arasında

function foo() {  
    var g = document.getElementById.bind(document);  
    g('sampleID'); 
} 
+1

Harika yanıt +2 ':) –

+0

+1. Bunlardan herhangi birine karşı tavsiyede bulunmalıyım. Document.getElementById() 'öğesi çok uzunsa, yalnızca bir ana bilgisayar yöntemine başvuru oluşturmaya çalışmak yerine, daha kısa bir adla bir işleve sarın. –

+0

@Tim Down: kararlaştırıldı, bunun gibi bir şey için 'bind' kullanılmasının gerekli olduğunu düşünmüyorum. Bir süre önce performansı test ettim ve Chrome ve Firefox'taki büyüklükteki siparişler buydu (neden olduğundan emin değilim). –

İlgili konular