다음을 통해 공유


JScript 이전 버전에서 만든 응용 프로그램 업그레이드

업데이트: 2007년 11월

JScript 8.0은 이전 버전과 거의 완전하게 호환이 가능하기 때문에 대부분의 기존 JScript 코드를 JScript 8.0의 향상된 기능에서 사용해도 문제가 없습니다. JScript 8.0의 새로운 기능은 새로운 영역을 다룹니다.

기본적으로 JScript 8.0 프로그램은 고속 모드로 컴파일됩니다. 고속 모드를 사용할 경우 허용되는 코드 형식이 약간 제한되므로 응용 프로그램을 보다 빠르고 효율적으로 실행할 수 있습니다. 그러나, 고속 모드에서는 이전 버전의 일부 기능을 사용할 수 없습니다. 고속 모드에서 사용할 수 없는 기능은 대부분 다중 스레드 응용 프로그램과 호환되지 않는 기능들로서 비효율적인 코드를 생성합니다. 명령줄 컴파일러를 사용하여 컴파일한 프로그램의 경우에는 고속 모드를 해제하면 이전 버전과의 호환이 가능합니다. 그러나 이런 방법으로 컴파일된 코드는 속도가 느리고 오류가 발생하기 쉽습니다. ASP.NET 응용 프로그램에서는 안정성 문제 때문에 고속 모드를 해제할 수 없습니다. 자세한 내용은 /fast를 참조하십시오.

고속 모드

고속 모드에서는 다음과 같은 JScript 동작이 트리거됩니다.

  • 모든 변수를 선언해야 합니다.

  • 함수는 상수로 사용됩니다.

  • 내장 개체는 expando 속성을 가질 수 없습니다.

  • 내장 개체는 나열되거나 변경된 속성을 가질 수 없습니다.

  • arguments 개체는 사용할 수 없습니다.

  • 읽기 전용 변수, 필드 또는 메서드에 할당할 수 없습니다.

  • eval 메서드는 포함 범위에 식별자를 정의할 수 없습니다.

  • eval 메서드는 제한된 보안 컨텍스트에서 스크립트를 실행합니다.

모든 변수를 선언해야 합니다.

JScript 이전 버전에서는 변수의 명시적 선언이 요구되지 않았습니다. 그러나 변수를 명시적으로 선언하지 않으면 프로그래머의 키 입력 횟수는 줄지만, 오류를 추적하기가 어렵습니다. 예를 들어, 잘못 입력한 변수 이름에 값을 할당하면 오류가 발생하지도 않고 원하는 결과도 반환되지 않습니다. 더욱이 선언되지 않은 변수는 전역 범위를 가지므로 혼란이 가중될 수 있습니다.

고속 모드에서는 변수를 명시적으로 선언해야 합니다. 이렇게 하면 앞에 설명한 형태의 오류가 발생하는 것을 방지하고 실행 속도가 보다 빠른 코드를 작성하는 데 도움이 됩니다.

또한 JScript .NET에서는 형식 주석 변수를 지원합니다. 형식 주석을 사용하면 각 변수가 특정 데이터 형식과 바인딩되고 변수에는 해당 형식의 데이터만 저장할 수 있습니다. 형식 주석은 반드시 사용해야 하는 것은 아니지만 사용하면 변수에 잘못된 데이터를 실수로 저장하는 오류를 방지하고 프로그램 실행 속도를 향상시킬 수 있습니다.

자세한 내용은 JScript 변수 및 상수를 참조하십시오.

함수는 상수로 사용됩니다.

이전 버전의 JScript에서는 function 문을 사용하여 선언한 함수가 Function 개체를 저장하는 변수와 동일하게 취급되었습니다. 특히, 어떠한 함수 식별자나 변수로 사용하여 모든 데이터 형식을 저장할 수 있었습니다.

고속 모드에서 함수는 상수가 됩니다. 따라서, 함수에 새로운 값을 할당하거나 함수를 재정의할 수 없습니다. 이렇게 하면 함수의 의미를 잘못해서 변경하는 일을 막을 수 있습니다.

스크립트에서 함수 변경이 필요한 경우에는 변수를 명시적으로 사용하여 Function 개체의 인스턴스를 저장할 수 있습니다. 그러나, Function 개체는 속도가 느립니다. 자세한 내용은 Function 개체를 참조하십시오.

내장 개체는 expando 속성을 가질 수 없습니다.

JScript 이전 버전에서는 내장 개체에 expando 속성을 추가할 수 있었습니다. 이 기능은, 예를 들어, String 개체에 문자열의 선행 공백을 제거하는 메서드를 추가하는 데 사용할 수 있었습니다.

고속 모드에서는 이것이 허용되지 않습니다. 이 기능에 의존하는 스크립트는 수정이 필요합니다. 함수를 메서드로 개체에 추가하는 대신 전역 범위에서 함수를 정의할 수 있습니다. 그런 다음 개체에서 expando 메서드를 호출하는 스크립트의 각 인스턴스를 다시 작성하여 개체가 해당 함수에 전달되도록 합니다.

Global 개체는 이 규칙에서 제외되므로 expando 속성을 가질 수 있습니다. 전역 범위의 모든 식별자는 실제로는 Global 개체의 속성입니다. 새로운 전역 변수의 추가를 지원하려면 Global 개체가 동적으로 확장될 수 있어야 합니다.

내장 개체는 나열되거나 변경된 속성을 가질 수 없습니다.

이전 버전의 JScript에서는 내장 개체의 미리 정의된 속성에 대해 삭제, 열거 또는 쓰기가 가능했습니다. 예를 들어, 이 기능은 Date 개체의 기본값인 toString 메서드를 변경하는 데 사용할 수 있었습니다.

고속 모드에서는 이것이 허용되지 않습니다. 내장 개체는 expando 속성을 가질 수 없고 각 개체의 속성은 참조 섹션에 나열되기 때문에 이 기능은 더 이상 필요하지 않습니다. 자세한 내용은 개체를 참조하십시오.

arguments 개체는 사용할 수 없습니다.

JScript 이전 버전에서는 함수 정의 내에 arguments 개체를 제공하므로 함수에서 임의 개수의 인수를 허용할 수 있었습니다. 또한 arguments 개체는 호출하는 함수는 물론 현재 함수에 대한 참조도 제공했습니다.

고속 모드에서는 arguments 개체를 사용할 수 없습니다. 그러나 JScript 8.0에서는 함수 선언 시 함수 매개 변수 목록에 매개 변수 배열을 지정할 수 있습니다. 이렇게 하면 함수에서 임의 개수의 인수를 받아들여 arguments 개체의 기능을 대신할 수 있습니다. 자세한 내용은 function 문을 참조하십시오.

고속 모드에서는 현재 함수나 호출하는 함수에 직접 액세스하거나 참조할 방법이 없습니다.

읽기 전용 변수, 필드 또는 메서드에 할당할 수 없습니다.

JScript 이전 버전에서는 문을 사용하여 읽기 전용 식별자에 값을 할당할 수 있었습니다. 할당 작업은 실패해도 표시가 나지 않으므로, 해당 값이 실제로 변경되었는지 여부를 테스트하기 전에는 이 사실을 알 수가 없으며, 읽기 전용 식별자에 값을 할당해도 아무 영향이 없으므로 이런 할당은 실수로 인한 것입니다.

고속 모드에서는 읽기 전용 식별자에 값을 할당하려고 하면 컴파일 타임 오류가 발생합니다. 할당을 제거하거나 읽기 전용이 아닌 식별자에 할당할 수 있습니다.

고속 모드를 해제한 경우 읽기 전용 식별자에 값을 할당하면 런타임에는 경고가 생기지 않으나 컴파일 타임에 경고가 발생합니다.

eval 메서드는 포함 범위에 식별자를 정의할 수 없습니다.

JScript 이전 버전에서는 eval 메서드를 호출하여 함수와 변수를 지역 범위나 전역 범위에서 정의할 수 있었습니다.

고속 모드에서는 eval 메서드에 대한 호출 내에 함수와 변수를 정의할 수는 있지만 그 특정한 호출 내에서만 액세스할 수 있습니다. eval이 완료되면 eval 내에 정의된 함수와 변수에 더 이상 액세스할 수 없습니다. eval 내에서 이루어진 계산의 결과는 현재 범위에서 액세스할 수 있는 어느 변수에나 할당할 수 있습니다. eval 메서드에 대한 호출은 속도가 느리므로 이 메서드를 포함하는 코드를 다시 작성하는 것이 좋습니다.

고속 모드를 해제하면 eval 메서드의 이전 동작이 복원됩니다.

eval 메서드는 제한된 보안 컨텍스트에서 스크립트를 실행합니다.

이전 버전의 JScript에서 eval 메서드에 전달된 코드는 호출 코드와 같은 보안 컨텍스트에서 실행되었습니다.

사용자를 보호하기 위해서 eval 메서드에 전달된 코드는 "unsafe" 문자열이 두 번째 매개 변수로 전달되지 않는 경우 제한된 보안 컨텍스트에서 실행됩니다. 제한된 보안 컨텍스트에서는 파일 시스템, 네트워크 또는 사용자 인터페이스 같은 시스템 리소스에 액세스할 수 없습니다. 코드가 이러한 리소스에 액세스하려고 하면 보안 예외가 발생합니다.

eval의 두 번째 매개 변수가 "unsafe" 문자열이면 eval 메서드에 전달된 코드는 호출 코드와 같은 보안 컨텍스트에서 실행됩니다. 여기에서는 eval 메서드의 이전 동작이 복원됩니다.

보안 정보:

안전하지 않은 모드에서 eval을 사용해야 하는 경우에는 잘 알려진 소스에서 얻은 코드 문자열만 실행하십시오.

참고 항목

개념

JScript 프로그래머를 위한 JScript 8.0 소개

참조

/fast

기타 리소스

JScript 사용 시작