为什么JavaScript中的某些函数调用被称为“非法调用”?

时间:2012-05-24 18:52:39

标签: javascript invocation

例如,如果我这样做:

var q = document.querySelectorAll;

q('body');

我在Chrome中收到“非法调用”错误。我想不出为什么这是必要的任何理由。首先,并非所有本机代码功能都是如此。事实上,我可以这样做:

var o = Object; // which is a native code function

var x = new o();

一切正常。特别是在处理文档和控制台时我发现了这个问题。有什么想法吗?

4 个答案:

答案 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)

在我的情况下,由于将未声明的变量作为参数传递而发生了非法调用。 确保在传递给函数之前声明变量。