例如,如果我这样做:
var q = document.querySelectorAll;
q('body');
我在Chrome中收到“非法调用”错误。我想不出为什么这是必要的任何理由。首先,并非所有本机代码功能都是如此。事实上,我可以这样做:
var o = Object; // which is a native code function
var x = new o();
一切正常。特别是在处理文档和控制台时我发现了这个问题。有什么想法吗?
答案 0 :(得分:121)
这是因为你已经失去了该功能的“背景”。
致电时:
document.querySelectorAll()
该函数的上下文为document
,并且可以通过该方法的实现以this
访问。
当您只是致电q
时,不再有上下文 - 而是“全局”window
对象。
querySelectorAll
的实现尝试使用this
,但它不再是DOM元素,而是Window
对象。实现尝试调用Window
对象上不存在的DOM元素的某个方法,并且解释器不出所料地调用犯规。
要解决此问题,请在较新版本的Javascript中使用.bind
:
var q = document.querySelectorAll.bind(document);
将确保q
的所有后续调用都具有正确的上下文。如果您还没有.bind
,请使用:
function q() {
return document.querySelectorAll.apply(document, arguments);
}
答案 1 :(得分:0)
你可以像这样使用:
let qsa = document.querySelectorAll;
qsa.apply(document,['body']);
答案 2 :(得分:-1)
另一个简洁的解决方案:
const q=s=>document.querySelectorAll(s);
q('body');
答案 3 :(得分:-2)
在我的情况下,由于将未声明的变量作为参数传递而发生了非法调用。 确保在传递给函数之前声明变量。