이 단순화 된 코드 유사한 문제 나타내는이 경우
var x = Function.call.call;
x(alert);
를 한번 Function.call.call
가 호출되는, 그것의 출발 컨텍스트 (즉 Function.call
)를 기억할 것이다.
Function.call.bind(Function.call)
그것은 Function.call
의 상황이 이렇게 컨텍스트를 저장 자체에 바인딩함으로써 새로운 기능을 반환 :이 컨텍스트를 저장하려면,이
신성 구조
트릭을 사용할 수 있습니다. 새 변수에이 표현을 저장할 수 있습니다
var callFn = Function.call.bind(Function.call);
이제 callFn(alert)
가 alert.call()
동일합니다. 추가 인수는 그대로 따라 전달되므로 callFn(alert, window)
은 alert.call(window)
을 호출합니다. 이 Array.forEach
과 같이 콜백의 일부로 호출되면 각 반복에서 세 개의 인수가 전달되는 상황에서이 동작을 이해하는 것이 중요합니다. 귀하의 경우에는
fns.forEach(callFn);
,
fns
내부의 기능 중 어느 것도 전달되는 인수를 사용하지 않습니다,하지만 무대 뒤에서 그들은 다음과 같이라는 것 : 그래서
this
이 요소의 인덱스 (동일
fns[0].call(0, fns)
즉 Number(0)
)이고 arguments[0]
은 함수 배열과 같습니다. 예리한 관찰자는 요소의 값이 균열 사이에 있음을 알 수 있지만 여전히 arguments[0][this]
또는 대체적으로 arguments.callee
(사용되지 않음)을 사용하여 참조 할 수 있습니다.
빙고, 그게 다야! 많은 감사합니다. – georg
인수에 대한 후속 조치가 잘되었지만 '호출 수신자'가 아닌 이유는 무엇입니까? 단순히'인수 [0] [this]'에 무엇이 잘못 되었습니까? – georg
@ thg435 좋은 지적입니다. 이 경우 작동합니다 :) 감사합니다! –