는 ECMAScript의 같은 호출 객체의 개념을 가지고, ...
자바 스크립트를 소리. 호출 가능한 모든 객체에는 내부 속성[[Call]]
이 있습니다. 이 속성은 ECMA-262 사양, 제 5 판의 섹션 8.6.2, 표 9에 설명되어 있습니다. 그것은 :
개체와 관련된 코드를 실행합니다. 함수 호출 식을 통해 호출됩니다. SpecOp에 대한 인수는이 개체와 함수 호출 식에 전달 된 인수가 포함 된 목록입니다. 이 내부 메소드를 구현하는 객체는 호출 가능합니다. 호스트 객체 인 호출 가능 객체 만 참조 값을 반환 할 수 있습니다.
내부 속성은 이름이없는 및 ECMAScript를 언어 사업자를 통해 직접 액세스 할 수 없습니다 :
는 그러나주의해야 할 것은 [[Call]]
은 사양 말한다하는 내부 속성이라고합니다. 내부 속성은 사양 용도로만 존재합니다.
그래서이 자바 스크립트 코드에는이 메커니즘을 사용할 수 없습니다.
지금
는 Function.prototype
, apply
및 call
에 정의 두 가지 방법이있다.
Function.prototype.call
의 정의를 변경하면 자신의 함수
f
을 생성하면
f.call
이 참으로됩니다 (f의 프로토 타입 또는 f 자체에서 재정의되지 않는 한) 실제로 해당 코드가 실행됩니다. 이것은 예상대로 자동으로
f
을 호출하여 발생하지 않습니다. 명시 적으로
call
메서드를 호출해야합니다.
모든 것이 내장 객체의 프로토 타입에 미리 정의 된 표준 방법을 사용하지 않는 것이 가장 좋습니다. 라이브러리 및 응용 프로그램의 많은 기존 코드는 Function.prototype.call
에 의존합니다. 그것을 망쳐 놓지 마십시오. 물론 여러 가지 방법으로 일종의 AOP 동작을 구현할 수 있습니다. 하나는 Function.prototype
다른 방법으로 에 추가하는 것이지만 중 하나를 수행하지 마십시오. 또 하나는 이전과 이후의 훅을 사용하여 자신의 호출 메소드를 작성하는 것입니다.
function call(theThis, before, main, after, beforeArgs, mainArgs, afterArgs) {
before.apply(theThis, beforeArgs);
main.apply(theThis, mainArgs);
after.apply(theThis. afterArgs);
}
'Function.call'을 생각 하시나요? 'Object.prototype'에'call' 메서드는 없습니다. –
아마 당신은 당신이 정말로 성취하려는 것을 설명 할 수 있습니다. 나는 자바 스크립트 레벨에서 모든 자바 스크립트 함수 호출을 인터셉트 할 수 있다고 생각하지 않는다.JS 엔진 내부의 일부 훅에 액세스해야 할 수도 있습니다. – jfriend00