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

2022-08-30 04:54:44

例如,如果我这样做:

var q = document.querySelectorAll;

q('body');

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

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

var x = new o();

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


答案 1

这是因为您丢失了函数的“上下文”。

当您呼叫时:

document.querySelectorAll()

函数的上下文是 ,并且可以通过该方法的实现来访问。documentthis

当你只是调用时,就不再有上下文 - 而是“全局”对象。qwindow

的实现尝试使用,但它不再是DOM元素,而是一个对象。该实现尝试调用对象上不存在的 DOM 元素的某个方法,并且解释器不出所料地调用 foul。querySelectorAllthisWindowWindow

要解决此问题,请在较新版本的 Javascript 中使用:.bind

var q = document.querySelectorAll.bind(document);

这将确保所有后续调用都具有正确的上下文。如果您还没有 ,请使用以下命令:q.bind

function q() {
    return document.querySelectorAll.apply(document, arguments);
}

答案 2

你可以像这样使用:

let qsa = document.querySelectorAll;
qsa.apply(document,['body']);