比如,如果我这样做:
var q = document.querySelectorAll;
q('body');
我在Chrome中遇到了“非法调用”错误。我想不出任何原因为什么这是必需的。首先,这并不适用于所有本地代码函数。事实上,我可以这样做:
var o = Object; // which is a native code function
var x = new o();
一切都运作得很好。但特别是在处理文档和控制台时,我发现了这个问题。你有什么想法吗?
比如,如果我这样做:
var q = document.querySelectorAll;
q('body');
我在Chrome中遇到了“非法调用”错误。我想不出任何原因为什么这是必需的。首先,这并不适用于所有本地代码函数。事实上,我可以这样做:
var o = Object; // which is a native code function
var x = new o();
一切都运作得很好。但特别是在处理文档和控制台时,我发现了这个问题。你有什么想法吗?
这是因为您已经失去了函数的“上下文”。
当您调用:
document.querySelectorAll()
函数的上下文是document
对象,并且该方法的实现可以通过this
来访问该上下文。q
时,就没有上下文了,它将变成"全局"window
对象。
querySelectorAll
方法的实现尝试使用this
,但此时它不再是一个DOM元素,而是一个Window
对象。该实现尝试调用某个在Window
对象上不存在的DOM元素方法,解释器毫不意外地发出错误信息。.bind
方法:var q = document.querySelectorAll.bind(document);
这将确保所有后续对 q
的调用都有正确的上下文。如果你没有 .bind
,可以使用以下代码:
function q() {
return document.querySelectorAll.apply(document, arguments);
}
function q(x){ return document.querySelectorAll(x); }
。我真的很喜欢IE浏览器对象的另一件事情是,其中一些对象如果你尝试从中读取属性,它们会抛出异常,因此你需要使用if( 'funcname' in browserobject)
而不是通常的if(browserobject.funcname)
来测试功能! - hugomglet qsa = document.querySelectorAll;
qsa.apply(document,['body']);
something
方法就失去了document的上下文。 - Anshul Sahni