예를 들어 이렇게하면 :
var q = document.querySelectorAll;
q('body');
Chrome에서 ‘잘못된 호출’오류가 발생합니다. 왜 이것이 필요한지 생각할 수 없습니다. 하나의 경우 모든 네이티브 코드 기능이있는 것은 아닙니다. 사실 나는 이것을 할 수있다 :
var o = Object; // which is a native code function
var x = new o();
그리고 모든 것이 잘 작동합니다. 특히 문서와 콘솔을 다룰 때이 문제를 발견했습니다. 이견있는 사람?
답변
함수의 “컨텍스트”를 잃어 버렸기 때문입니다.
전화 할 때 :
document.querySelectorAll()
함수의 컨텍스트는 이며 해당 메서드를 구현하여 document
액세스 할 수 있습니다 this
.
그냥 호출하면 q
더 이상 컨텍스트가 없습니다 window
. 대신 “전역” 객체입니다.
구현은 querySelectorAll
사용 을 시도 this
하지만 더 이상 DOM 요소가 아니라 Window
객체입니다. 구현은 Window
객체에 존재하지 않는 DOM 요소의 일부 메서드를 호출하려고 시도 하고 인터프리터는 당연히 파울을 호출합니다.
이 문제를 해결하려면 .bind
최신 버전의 Javascript를 사용하십시오.
var q = document.querySelectorAll.bind(document);
모든 후속 호출이 q
올바른 컨텍스트 를 갖도록합니다. 없는 경우 다음을 .bind
사용하십시오.
function q() {
return document.querySelectorAll.apply(document, arguments);
}
답변
제 경우에는 선언되지 않은 변수를 인수로 사용하여 잘못된 호출이 발생했습니다. 함수에 전달하기 전에 변수를 선언해야합니다.
답변
다음과 같이 사용할 수 있습니다.
let qsa = document.querySelectorAll;
qsa.apply(document,['body']);
답변
한 가지 더 간결한 해결책 :
const q=s=>document.querySelectorAll(s);
q('body');
답변
