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

use*_*187 79 javascript invocation

例如,如果我这样做:

var q = document.querySelectorAll;

q('body');
Run Code Online (Sandbox Code Playgroud)

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

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

var x = new o();
Run Code Online (Sandbox Code Playgroud)

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

Aln*_*tak 132

这是因为你失去了这个功能的"背景".

你打电话的时候:

document.querySelectorAll()
Run Code Online (Sandbox Code Playgroud)

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

当你只是打电话q不再有上下文时 - 它就是"全局" window对象.

querySelectorAll尝试使用的实现,this但它不再是DOM元素,它是一个Window对象.实现尝试调用某个Window对象上不存在的DOM元素的方法,并且解释器毫不奇怪地调用了犯规.

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

var q = document.querySelectorAll.bind(document);
Run Code Online (Sandbox Code Playgroud)

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

function q() {
    return document.querySelectorAll.apply(document, arguments);
}
Run Code Online (Sandbox Code Playgroud)

  • 哦,好的电话.你是对的,因为我能做到:q.apply(document,['body']); 它的工作原理. (2认同)