使用document.querySelector进行非法调用

时间:2012-09-28 09:16:14

标签: javascript dom

  

可能重复:
  JavaScript function aliasing doesn't seem to work

相关的jsfiddle:http://jsfiddle.net/cWCZs/1/

以下代码完美无缺:

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

但以下情况并非如此:

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

我不明白为什么。

我的困惑伴随着这样的事实:

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

1 个答案:

答案 0 :(得分:28)

问题出在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不是通用方法,它不接受另一个this值。因此,如果您需要快捷方式,则必须确保querySelector绑定到文档:

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