例如,如果我这样做:
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 元素的某些方法,并且解释器毫不奇怪地调用了 foul。
要解决此问题,请.bind
在较新版本的 Javascript 中使用:
var q = document.querySelectorAll.bind(document);
这将确保所有后续调用q
具有正确的上下文。如果你还没有.bind
,请使用这个:
function q() {
return document.querySelectorAll.apply(document, arguments);
}
在我的情况下,由于将未声明的变量作为参数传递给函数而发生非法调用。确保在传递给函数之前声明变量。
你可以这样使用:
let qsa = document.querySelectorAll;
qsa.apply(document,['body']);