나는 내가 파티에 늦었다는 것을 알고 있지만 여기에 초기 시도의 라인을 따라 더 짧은 방법이 있습니다.
a.replace('f', String.call.bind(a.toUpperCase));
그래서 당신은 어디로 잘못 갔고이 새로운 부두는 무엇입니까?
문제 1
앞에서 언급했듯이 호출 된 메서드의 결과를 String.prototype.replace () 의 두 번째 매개 변수로 전달하려고했지만 대신 함수에 대한 참조를 전달해야합니다.
해결 방법 1
해결하기 쉽습니다. 단순히 매개 변수와 괄호를 제거하면 함수를 실행하는 대신 참조를 얻을 수 있습니다.
a.replace('f', String.prototype.toUpperCase.apply)
문제 2
지금 코드를 실행하려고하면 undefined는 함수가 아니므로 호출 할 수 없다는 오류가 표시됩니다. 이는 String.prototype.toUpperCase.apply가 실제로 JavaScript의 프로토 타입 상속을 통해 Function.prototype.apply ()에 대한 참조이기 때문 입니다. 그래서 우리가 실제로하는 것은 다음과 같습니다.
a.replace('f', Function.prototype.apply)
분명히 우리가 의도 한 것이 아닙니다. String.prototype.toUpperCase () 에서 Function.prototype.apply () 를 실행하는 방법을 어떻게 알 수 있습니까? 있습니까?
해결책 2
Function.prototype.bind ()를 사용하여 컨텍스트가 String.prototype.toUpperCase로 특별히 설정된 Function.prototype.call의 복사본을 만들 수 있습니다. 이제 다음이 있습니다.
a.replace('f', Function.prototype.apply.bind(String.prototype.toUpperCase))
문제 3
마지막 문제는 String.prototype.replace () 가 대체 함수에 여러 인수를 전달 한다는 것입니다. 그러나 Function.prototype.apply () 는 두 번째 매개 변수가 배열 일 것으로 예상하지만 대신 문자열 또는 숫자를 가져옵니다 (캡처 그룹을 사용하는지 여부에 따라 다름). 이로 인해 잘못된 인수 목록 오류가 발생합니다.
해결책 3
운 좋게도 Function.prototype.call ()을 간단히 Function.prototype.apply ()으로 대체 할 수 있습니다 (어떤 수의 인수도 허용하지만 유형 제한이 없음 ) . 이제 작업 코드에 도달했습니다!
a.replace(/f/, Function.prototype.call.bind(String.prototype.toUpperCase))
흘리는 바이트!
아무도 프로토 타입 을 여러 번 타이핑 하고 싶어하지 않습니다 . 대신 상속을 통해 동일한 메서드를 참조하는 객체가 있다는 사실을 활용합니다. 함수 인 String 생성자는 Function의 프로토 타입에서 상속됩니다. 이는 String.call에서 Function.prototype.call을 대체 할 수 있음을 의미합니다 (실제로 Date.call을 사용하여 더 많은 바이트를 절약 할 수 있지만 의미가 적습니다).
프로토 타입에 String.prototype.toUpperCase에 대한 참조가 포함되어 있기 때문에 변수 'a'를 활용할 수도 있습니다. a.toUpperCase로 바꿀 수 있습니다. 위의 세 가지 솔루션과 이러한 바이트 절약 조치의 조합이이 게시물의 맨 위에있는 코드를 얻는 방법입니다.