为什么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。