웹 개발

[javascript error] 삭제된 스크립트의 코드는 수행할 수 없습니다.

노루아부지 2020. 3. 11. 11:06

삭제된 스크립트의 코드는 수행할 수 없습니다.

 

이 오류는 Chrome에서는 발생하지 않고, IE에서 발생합니다. ( 하.... 역시 IE )

(다른 브라우저는 확인하지 못했습니다.)

 

javascript에서 대입의 개념

JavaScript에서 Object 대입은 참조(Call by reference)입니다.

var orgObj = {name:'lee', age:'20'};
var copyObj = orgObj;

copyObj.age=30;

console.log(objObj);
console.log(copyObj);

 

위 코드의 결과에서 age의 값은 모두 30이 됩니다.

그래서 위와 같이 복사를 해야 할 경우에 deep copy를 통해 javascript의 object를 copy 합니다.

 

오류의 원인

1. main.jsp에서 sub.jsp를 호출(iframe을 이용한 dialog 형태)

2. sub.jsp에서 아래와 같은 코드 작성

var orgObj = {name:'lee', age:20};

parent.copyObj = objObj;

3. dialog(sub.jsp)를 close

4. main.jsp에 선언되어 있는 copyObj를 사용

5. 삭제된 스크립트의 코드는 수행할 수 없습니다. 오류 발생

   또는 $.each를 사용할 경우 Failure parsing JSON 오류 발생

 

참조의 원본이 되었던 sub.jsp가 close 되는 시점에 orgObj가 삭제되었기 때문에 문제가 발생한 것입니다.

 

 

해결방법

따라서 아래와 같이 deep copy를 하도록 코드를 변경해야 합니다.

 

방법 1. jQuery.extend 사용

parent.copyObj = jQuery.extend(true, {}, orgObj);

방법 2. JSON.parse, JSON.stringify 사용

parent.copyObj = JSON.parse(JSON.stringify(orgObj));

 

 

 

추가사항

위의 경우 이외에도 아래와 같은 경우에 같은 오류가 발생합니다.

 

1. main.jsp에서 sub.jsp를 호출(iframe을 이용한 dialog 형태)

2. sub.jsp에서 아래와 같은 코드 작성

// 배열의 초기화를 sub.jsp에서 했기 때문에 메모리가 sub.jsp에 할당.
// sub.jsp를 close한 후 copyObj를 사용할 때 오류 발생
parent.copyObj = [];

parent.copyObj.push(10);
parent.copyObj.push(20);

3. dialog(sub.jsp)를 close

4. main.jsp에 선언되어 있는 copyObj를 사용

5. 삭제된 스크립트의 코드는 수행할 수 없습니다. 오류 발생

 

 

추가사항 - 해결방법

이같은 경우에는 main.jsp에서 배열을 초기화하고, push를 sub.jsp에서 하면 됩니다.

 

main.jsp

var copyObj = undefined;

function initCopyObj() {
    copyObj = [];
}

sub.jsp

parent.initCopyObj();

parent.copyObj.push(10);
parent.copyObj.push(20);
728x90
loading