2011-02-06 9 views
6

Eventuali duplicati:
JavaScript function aliasing doesn't seem to workJavaScript: Riferimento funzione host tramite variabile locale

Perché non fa questo lavoro?

function foo() { 

    var g = document.getElementById; 

    g('sampleID'); 

} 

Questo errore è gettato in Chrome: Uncaught TypeError: Illegal invocation
... e in Firefox: Error: uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object"

Funziona in IE9 beta però !!

Demo:http://jsfiddle.net/ugBpc/

+0

possibile duplicato del [funzione JavaScript aliasing non sembra funzionare] (http: // StackOverflow. it/questions/1007340/javascript-function-aliasing-doesnt-seem-to-work) –

+0

Hai provato, 'g.call (document, 'sampleID');' ?? – Pointy

+0

@Pointy No, non pensavo in anticipo :) –

risposta

5

maggior parte dei browser richiedono che il metodo document.getElementById viene chiamato nel contesto dell'oggetto originale (document). Quindi questo dovrebbe funzionare:

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

Questo fallirà in Internet Explorer 7 e inferiore, però, perché i metodi DOM non ereditano da Function.prototype. Il tuo esempio originale dovrebbe funzionare in tutte le versioni di Internet Explorer.

Si potrebbe anche usare Function.prototype.bind, nei browser che lo supportano o di cui ha fornito il compatibility implementation:

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

Grande risposta +2 ':)' –

+0

+1. Vi sconsiglio comunque di fare nulla di tutto ciò. Se 'document.getElementById()' è troppo lungo, basta avvolgerlo in una funzione con un nome più breve piuttosto che tentare di creare un riferimento a un metodo host. –

+0

@Tim Down: d'accordo, non penso sia necessario usare 'bind' per qualcosa di simile. Ho provato le prestazioni qualche tempo fa e sono stati gli ordini di grandezza più lenti in Chrome e Firefox (anche se non sono sicuro del perché). –

Problemi correlati