Например, если я сделаю это:
var q = document.querySelectorAll;
q('body');
Я получаю сообщение об ошибке «Незаконный вызов» в Chrome. Я не могу придумать ни одной причины, по которой это необходимо. Во-первых, это не относится ко всем функциям машинного кода. На самом деле я могу это сделать:
var o = Object; // which is a native code function
var x = new o();
И все работает нормально. В частности, я обнаружил эту проблему при работе с документом и консолью. есть идеи?
javascript
invocation
user1152187
источник
источник
Ответы:
Это потому, что вы потеряли «контекст» функции.
Когда вы звоните:
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); }
источник
function q(x){ return document.querySelectorAll(x); }
. Еще одна вещь, которая мне очень нравится в объектах браузера IE, - это то, что некоторые из них выдают исключение, если вы пытаетесь прочитать из них свойство, поэтому вам нужно тестировать функции с помощьюif( 'funcname' in browserobject)
вместо обычныхif(browserobject.funcname)
!В моем случае незаконный вызов произошел из-за передачи необъявленной переменной в качестве аргумента. Обязательно объявите переменную перед переходом к функции.
источник
something
метод теряет контекст документавы можете использовать так:
let qsa = document.querySelectorAll; qsa.apply(document,['body']);
источник
Еще одно лаконичное решение:
const q=s=>document.querySelectorAll(s); q('body');
источник