为什么JavaScript中某些函数调用被称为“非法调用”?
例如,如果我这样做:
var q = document.querySelectorAll; q('body');
Chrome中出现“非法调用”错误。 我想不出为什么这是必要的。 首先,所有本机代码function都不是这样。 其实我可以这样做:
var o = Object; // which is a native code function var x = new o();
一切正常。 特别是在处理文档和控制台时,我发现了这个问题。 有什么想法吗?
这是因为你已经失去了function的“背景”。
你打电话时:
document.querySelectorAll()
该函数的上下文是document
,并将通过该方法的实现来访问。
当你只是调用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); }
在我的情况下,由于传递未声明的variables作为参数发生非法调用。 确保在传递函数之前声明variables。