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

例如,如果我这样做:

var q = document.querySelectorAll;

q('body');

我在Chrome中遇到“非法调用”错误。我不能想到任何理由为什么这是必要的。一个,它不是所有本机代码函数的情况。事实上我可以这样做:

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

var x = new o();

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

这是因为你已经失去了函数的“上下文”。

你打电话时:

document.querySelectorAll()

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

当你调用q时,不再有上下文 – 它是“全局”窗口对象。

querySelectorAll的实现尝试使用它,但它不再是一个DOM元素,它是一个Window对象。实现尝试调用一个不存在于Window对象上的DOM元素的一些方法,并且解释器不必要地调用foul。

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

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

这将确保q的所有后续调用具有正确的上下文。如果你没有.bind,使用这个:

function q() {
    return document.querySelectorAll.apply(document, arguments);
}
http://stackoverflow.com/questions/10743596/why-are-certain-function-calls-termed-illegal-invocations-in-javascript

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:为什么在JavaScript中某些函数调用被称为“非法调用”?