JavaScript 모드 전환에 대한 고려 사항

  • 릴리스 버전: Xanadu
  • 업데이트 날짜 2024년 08월 01일
  • 읽기4분
  • 응용 프로그램이나 스크립트의 JavaScript 모드를 전환하면 기존 스크립트의 동작이 변경될 수 있습니다. JavaScript 모드를 전환하기 전에 또는 전환 후 발생하는 문제를 해결하기 위해 동작 변경사항의 몇 가지 예를 검토하십시오.

    각 JavaScript 모드에 대한 자세한 내용은 및 JavaScript 엔진 기능 지원를 참조하십시오JavaScript 모드.

    이 표는 JavaScript 동작이 관대하고 오류가 발생하기 쉬운 ES5 이전 환경에서 더 엄격하고 예측 가능한 ES5, 그리고 마지막으로 ES12(ECMAScript 2021)의 더 풍부한 기능 환경으로 어떻게 발전했는지 강조합니다.

    표 1. JavaScript 모드의 동작 차이
    기능 호환성 모드 ES5 표준 모드 ECMAScript 2021(ES12)
    인수 객체 arguments 객체가 존재하지만 엄격 모드가 없으므로 수정 사항은 인수에 반영됩니다. 인쇄:
    *** Script: [object Arguments]
    *** Script: [object Arguments]
    *** Script: [object Arguments]
    *** Script: 123
    엄격 모드에서 arguments 객체는 매개 변수 수정 사항을 반영하지 않고 오류를 발생시킵니다. 인쇄:
    sn_es5: 123
    sn_es5: undefined
    sn_es5: [object Arguments]
    sn_es5: 123
    ES5와 동일합니다.
    부울 재정의 기본 부울(true, false)을 재정의하여 예기치 않은 동작을 일으킬 수 있습니다. 기본 부울은 더 보호되지만 변수에 할당될 때 여전히 재정의될 수 있습니다. ES5와 동일하지만 엄격 모드는 일부 할당을 방지하는 데 도움이 됩니다. 조건식은 다음 형식으로 작성해야 합니다.
    (cond_expr instanceof Boolean ? cond_expr.valueOf() : cond_expr).
    구문 오류에 대한 예외 구문 오류는 런타임에 예외를 발생시킵니다. 오류 처리가 일관되지 않습니다. 예시:
    Javascript compiler exception: unterminated string literal (null.null.script; line 1) in:
    var b = '
    특히 엄격 모드에서 보다 일관된 구문 오류 처리. 예시:
    Evaluator: com.glide.script.RhinoEcmaError: unterminated string literal
       script : Line(1) column(9)
    ==>   1: var b = '
    ES5와 동일하지만 업데이트된 엔진에서 더 강력한 처리와 더 명확한 오류 메시지가 있습니다. 예시:
    SyntaxError: Unterminated string constant at line 1
    
    ==>   1: var b = '
    증가 및 감소 변수에 허용되지만 복잡한 식에서 예기치 않게 동작할 수 있습니다. 인쇄:
    *** Script: c: 1
    *** Script: gr.related_incidents: 1
    *** Script: 2
    *** Script: 3
    명확성이 향상되었지만 변수(var, let, const)에는 여전히 허용됩니다. 인쇄:
    sn_es5: c: 0
    sn_es5: gr.related_incidents: 1
    sn_es5: 1
    sn_es5: 2
    ES5와 동일하지만 일부 컨텍스트(예: const)에서 더 엄격한 규칙이 적용됩니다.
    라인 연속 백슬래시(\)와 함께 사용할 수 있지만 가독성 문제로 인해 사용하지 않는 것이 좋습니다. 이 예제에서는 세 가지 함수가 모두 호출됩니다.
    var expr = doFoo();  // do foo
               doBar();  // do bar 
               finish();   // all done
     eval(expr);
    
    호환성 모드와 동일합니다. 처리 라인 연속에는 변경 사항이 없습니다. 이전 예제에서 ES5는 첫 번째 함수 만 호출하고 표현식이 끝날 때까지 줄 바꿈을 포함하여 첫 번째 주석 뒤의 모든 것을 주석으로 처리합니다. ES5와 동일하지만 템플릿 리터럴이 더 읽기 쉬운 대안을 제공합니다.
    세미콜론 누락 자동 세미콜론 삽입(ASI)으로 인해 예기치 않은 동작이 발생하는 경우가 많았습니다. 세미콜론이 없는 경우 구문 오류를 발생시킵니다. ES5와 동일합니다. 업데이트된 관행은 명시적 세미콜론을 권장합니다.
    존재하지 않는 함수 존재하지 않는 함수를 호출하면 ReferenceError가 발생합니다. 함수가 아닌 항목이 호출되면 TypeError 를 발생시킵니다. 존재하지 않는 함수가 호출되거나 속성이 참조될 때 EcmaError를 발생시킵니다.
    존재하지 않는 속성 존재하지 않는 속성에 액세스하면 undefined가 반환됩니다. 오류가 발생하지 않았습니다. ES5 이전과 동일합니다. 호환성 모드 및 ES5 표준 모드와 동일합니다.
    숫자 리터럴 기본 decimal 및 hexadecimal 리터럴. 더 엄격한 구문 분석 규칙과 숫자 리터럴의 더 나은 처리를 도입했습니다. 이진수(0b), 8진수(0o) 및 BigInt 리터럴(123n)이 추가되었습니다.
    예약된 키워드를 속성으로 예약된 키워드는 사용할 수 없습니다. 예약된 키워드는 오류 없이 속성 이름으로 사용할 수 있습니다(예: obj.for). 반환될 때 개체를 인쇄합니다. ES5와 동일합니다.
    let 및 yield를 키워드로 처리 letyield 는 키워드가 아니며 식별자로만 사용할 수 있습니다. let 이 키워드로 소개되고 있습니다. yield 는 엄격 모드에서 예약되어 있습니다. 둘 다 키워드입니다. 식별자로 사용하면 구문 오류가 발생합니다.