[javascript] JavaScript에서 특정 함수 호출을 “불법 호출”이라고하는 이유는 무엇입니까?

예를 들어 이렇게하면 :

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');


답변