Почему определенные вызовы функций в JavaScript называются «незаконными вызовами»?

Например, если я сделаю это:

var q = document.querySelectorAll;

q('body');

Я получаю "Незаконный вызов" ошибка в Chrome. Я не могу думать ни о какой причине, почему это необходимо. Во-первых, это не относится ко всем функциям собственного кода. На самом деле я могу сделать это:

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

var x = new o();

И все работает просто отлично. В частности, я обнаружил эту проблему при работе с документом и консолью. Какие-нибудь мысли?

 Quentin24 мая 2012 г., 20:54
 Dan Dascalescu03 сент. 2016 г., 01:45
 HoLyVieR24 мая 2012 г., 20:56
возможный дубликатJavaScript function aliasing doesn't seem to work

Ответы на вопрос(3)

Когда вы звоните:

document.querySelectorAll()

контекст функцииdocumentи будет доступен какthis путем реализации этого метода.

Когда вы просто позвонитеq больше нет контекста - это "глобальный"window объект вместо

РеализацияquerySelectorAll пытается использоватьthis но это больше не элемент DOM, этоWindow объект. Реализация пытается вызвать некоторый метод элемента DOM, который не существует наWindow объект и интерпретатор неудивительно называет фол.

Чтобы решить эту проблему, используйте.bind в более новых версиях Javascript:

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

который будет гарантировать, что все последующие вызовыq иметь правильный контекст. Если у вас нет.bind, использовать этот:

function q() {
    return document.querySelectorAll.apply(document, arguments);
}
 24 мая 2012 г., 21:06
Обратите внимание, что это не обязательно работает для встроенных функций в IE. Например, console.log не имеет там метода apply.
 24 мая 2012 г., 21:42
@Alnitak: Да, он работает везде, кроме IE, и поэтому вам часто нужно просто передавать аргументы, как вfunction q(x){ return document.querySelectorAll(x); }, Еще одна вещь, которая мне действительно нравится в объектах браузера IE, это то, что некоторые из них выдают исключение, только если вы пытаетесь прочитать свойство из них, поэтому вам нужно протестировать функции сif( 'funcname' in browserobject) вместо обычногоif(browserobject.funcname)!
 user115218724 мая 2012 г., 20:55
О, хороший звонок. Вы правы, потому что я могу сделать: q.apply (document, ['body' apos;]); и это работает.
 22 авг. 2014 г., 16:48
Отличный ответ, я был действительно смущен этим явлением, точно такая же ситуация, как и ОП.
 24 мая 2012 г., 21:08
@missingno - это нормально для Chrome - еще один IE "special" Я думаю - вздох ...

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

переменной в качестве аргумента. Обязательно объявляйте переменную перед передачей в функцию.

 14 апр. 2018 г., 08:36
объявление переменной не имеет смысла для этого конкретного случая, так как незаконный вызов происходит, когда зависимый от dom метод вызывается из контекста DOM, потому что в тот момент, когда вы делаете q = document.something,something метод теряет контекст документа

Ваш ответ на вопрос