JavaScript에서 함수는 해당 범위에 대한 숨겨진 링크를 유지하여 클로저를 형성합니다. 이로 인해 질문이 제기됩니다. 함수가 변수 값으로 사용 가능한 경우 프로그래밍 방식으로 이 클로저에 액세스할 수 있습니까?
이 문의의 주요 동기는 이론적이지만 실제 적용에는 클로저의 속성을 나열하는 것이 포함될 수 있습니다. . 다음 코드를 고려해보세요.
<code class="js">var x = (function(){ var y = 5; return function() { alert(y); }; })(); //access y here with x somehow</code>
목표는 x 함수를 사용하여 변수 y에 액세스하는 것입니다.
프런트엔드 환경에서 실행할 수 있습니다. 이전 스크립트 태그에 JavaScript를 사용하는 경우 한 가지 접근 방식은 MutationObserver를 연결하는 것입니다. 이 관찰자는 검사하려는 스크립트 태그(이 경우 x)가 문서에 삽입될 때까지 기다리고 해당 코드를 수정하여 원하는 기능을 노출합니다.
예:
<code class="js">new MutationObserver((mutations, observer) => { // Find the target script tag const tamperTarget = document.querySelector('script + script'); if (!tamperTarget) { return; } observer.disconnect(); console.log('Target script getting tampered with'); // Modify the script's content to expose the closure tamperTarget.textContent = tamperTarget.textContent.replace( 'return function', 'window.y = y; return function' ); setTimeout(() => { console.log("Hacked into tamper target's script and found a y of", y); console.log('Could also have replaced the local y with another value'); }); }) .observe(document.body, { childList: true });</code>
이 스크립트는 관찰자를 document.body에 연결합니다. x 함수가 포함된 스크립트 태그가 삽입되면 관찰자는 라인 반환 함수를 실행하고 window.y = y로 바꿉니다. 반환 기능. 이렇게 하면 y 변수가 전역 변수(window.y)로 노출됩니다.
이후 원하는 대로 y 변수에 액세스하고 조작할 수 있습니다. 이 기술은 클로저 디버깅, 테스트 및 실험에 유용할 수 있습니다.
위 내용은 JavaScript에서 프로그래밍 방식으로 함수의 클로저에 액세스할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!