2012-09-28 25 views
11

Duplicar posibles:
JavaScript function aliasing doesn't seem to workinvocación ilegal con document.querySelector

jsFiddle relacionadas: http://jsfiddle.net/cWCZs/1/

El siguiente código funciona perfectamente:

var qs = function(s) { 
    return document.querySelector(s); 
}; 
qs('some selector'); 

Pero el siguiente no:

var qs = document.querySelector; 
qs('some selector'); // Uncaught TypeError: Illegal invocation 

No entiendo por qué.

Mi confusión viene con el hecho de que esto funciona:

function t() { 
    console.log('hi'); 
} 
var s = t; 
s(); // "hi" 

Respuesta

21

El problema radica en el valor this.

//in the following simile, obj is the document, and test is querySelector 
var obj = { 
    test : function() { 
     console.log(this); 
    } 
}; 

obj.test(); //logs obj 

var t = obj.test; 
t(); //logs the global object 

querySelector no es un método genérico, no va a aceptar otro valor this. Por lo tanto, si desea un acceso directo, debe asegurarse de que su querySelector está obligado al documento:

var qs = document.querySelector.bind(document); 
+1

Oh, eso es una manera mejor solución que el duplicado. –

Cuestiones relacionadas