2012-09-28 14 views
11

Mögliche Duplizieren:
JavaScript function aliasing doesn't seem to workIllegal Aufruf mit document.querySelector

Verwandte jsfiddle: http://jsfiddle.net/cWCZs/1/

Der folgende Code funktioniert perfekt:

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

Aber das folgende nicht:

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

Ich verstehe nicht warum.

Meine Verwirrung kommt mit der Tatsache, dass dies funktioniert:

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

Antwort

21

Das Problem liegt in dem this Wert.

//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 ist keine generische Methode, wird es nicht einen anderen this Wert annehmen. Also, wenn Sie eine Verknüpfung möchten, müssen Sie sicherstellen, dass Ihr querySelector an das Dokument gebunden ist:

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

Oh, das ist eine Möglichkeit, eine bessere Lösung als das doppelte. –

Verwandte Themen