例如,如果我这样做:
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();
而且一切正常。特别是在处理文档和控制台时,我发现了这个问题。有什么想法吗?
Answers:
这是因为您丢失了函数的“上下文”。
你打电话时:
document.querySelectorAll()
函数的上下文是document
,可以通过以下方式访问this
通过该方法的实现。
当您打电话时q
,不再有上下文-它是“全局”window
对象。
querySelectorAll
尝试使用的实现,this
但不再是DOM元素,而是一个Window
对象。该实现尝试调用Window
对象上不存在的DOM元素的某些方法,并且解释器毫不奇怪地调用foul。
要解决此问题,请.bind
在较新版本的Javascript中使用:
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)
!
在我的情况下,由于将未声明的变量传递为参数而发生了非法调用。确保在传递给函数之前先声明变量。
something
方法会失去文档的上下文