많은 웹 개발자가 이러한 문제에 직면했을 수 있습니다. 프로그램에서 "릴리스된 스크립트의 코드를 실행할 수 없습니다"라는 오류 라인 1, 열 1이 설명할 수 없을 정도로 나타납니다. 이러한 종류의 메시지에 대한 설명은 불분명하며 행 및 열 설명도 짝수입니다. JS 오류는 JS 프로그램을 디버깅하는 모든 친구들에게 가장 우울하고 싫은 일이라고 여겨집니다! 이런 종류의 문제가 발생했을 때 가장 쉬운 방법은 오류를 바이두나 구글의 작은 입력 상자에 직접 붙여넣고 몇 가지 지침을 제공한 후 해결하는 것입니다. 그러나 이번에는 그렇게 쉽지 않은 것 같습니다. Baidu에서 검색할 때 이런 문제가 발생했습니다. 이전에 이런 종류의 문제를 본 적이 있지만 항상 일종의 QQ 공간 오류이거나 미쳤거나 질문만 있고 답변이 없고 지루합니다!
이 오류는 어디서 발생하나요? 어쩔 수 없이 추측하고... 오류를 잡아내려고 한참을 검색한 끝에 오류 위치를 찾았지만, 나중에 쓴 내용에는 문제가 없다는 것을 알게 되었습니다. 프로그램의 설명 과정에 대해 생각해볼 생각은 있지만 아직은 아무것도 모르겠습니다. 바이두를 계속하다 갑자기 특정 웹 페이지에서 다음과 같은 문장을 봤습니다. 페이지가 닫히면 해당 페이지의 js가 자동으로 해제됩니다. 이 짧은 문장이 나에게 많은 영감을 주었다. 내 프로그램이 페이지를 닫았는지 아니면 페이지를 리디렉션했는지 확인했는데 리디렉션이 실행된 후 이 페이지로 돌아올 때 오류가 발생했습니다. 갑자기 나는 이해했다.
시나리오: 페이지에 iframe a와 b라는 두 개의 프레임 페이지가 있습니다. 페이지 b에서 함수 참조(함수 포인터)가 js를 통해 페이지 a로 전달되고 페이지 a의 변수에 저장됩니다. 이 참조를 사용하여 페이지 b를 작동하거나 페이지 b에서 일부 프로그램을 실행합니다. 기억하세요: 페이지 a의 변수는 페이지 b가 새로 고쳐지거나 리디렉션될 때 페이지 b에 있는 함수의 포인터(메모리 주소)를 저장합니다. b 페이지가 재구축되어 페이지 b의 함수 포인터가 변경되었으나 a는 페이지 b가 새로 고쳐지기 전에 전달된 포인터(메모리 주소)를 여전히 보유하고 있습니다. 이때 가리키는 포인터 주소를 통해 페이지 a의 변수에 접근할 수 없습니다. 페이지 b의 해당 함수(함수 포인터 주소가 변경되고 원래 메모리 포인터가 해제되었기 때문에)를 수행하면 실행 중에 "해제된 스크립트 코드를 실행할 수 없습니다"라는 오류가 발생합니다.
해결책: 페이지 a에 내결함성 처리를 추가합니다. 참조 오류가 발생하면 저장된 참조(함수 포인터)를 지우거나 기본 함수를 가리켜야 합니다. 또한, b 페이지를 다시 로드할 때 함수 참조를 a 페이지로 다시 전송해야 이러한 오류가 발생하지 않습니다.
여기 설명은 다소 추상적일 수 있습니다. 데모를 보고 코드를 살펴보면 이해하기 쉬울 것입니다. 먼저 테스트한 다음 URL을 반환하고 다시 테스트하면 이 문제가 발생합니다.