엄격한 모드 타운에 나오

2010년 12월 14일 오후 2시 12분에서 더글러스 Crockford에 의해 |에 개발 | 20 코멘트

이것은 전세계 사람들이 ECMAScript 프로그래밍 언어 표준, 다섯 번째 에디션 ECMA 총회의 승인의 첫 주년을 축하하기 위해 그들의 차이를 잊고 평화와 친교를 이루고 시간과 계절입니다. ES5의 가장 중요한 특징은 새로운 엄격 모드입니다. 엄격한 모드는 가입 선택 모드입니다 수리 또는 언어의 가장 문제가 기능의 일부를 제거합니다.

엄격 모드를 지정

엄격 모드를 요청하는 방법은 두 가지가 있습니다. 첫 번째는이에서 Pragma를 삽입하는 것입니다

  "엄격한을 사용"; 

파일이나 컴파일 단위의 상단. 그것은 다른 문장 앞에 나타나야합니다 있지만 공백 및 주석 앞에 수 있습니다. 그것은 쓸모없는 문자열 리터럴 구문의 형식을 가지고 있으므로 이것은 ES3 시스템에 의해 무시됩니다. 이것은 또한 이전 브라우저에서 실행할 수있는 프로그램을 ES5/strict 쓸 수있다는 것을 의미합니다. 엄격한 코드는 또한 비 엄격하게 (혹은 별거) 코드와 상호 작용할 수 있으므로 엄격한 기능은 별거 아닌 함수를 호출할 수 있으며, 별거 아닌 기능은 엄격한 함수를 호출할 수 있습니다. 호환성이 높은 수준은 엄격 모드를 채택하기가 쉽습니다.

있는 파일이나 컴파일 단위에 코드의 모든 "use strict"; 프리앰블는 엄격한 코드로 처리됩니다. 문제는 역시있다. 성능 고려 사항은 현재 누적 HTTP 지연을 방지하기 위해 함께 많은 자바 스크립트 파일을 연결할 우리에게 강요. 가진 파일이있다면 "use strict"; 프리앰블 그것에 추가 별거 아닌 코드를 가지고, 별거 아닌 코드는 엄격한으로 처리되며 아마도 실패합니다. 동일한 파일에 엄격하고 썩어 섞어 필요 없지만, 우리는 이미 몇몇 유명 웹 사이트가 잘못 보았다 :이 쉬운 규칙입니다.

두 번째 방법에서 Pragma이 함수의 첫 진술과 같습니다 삽입하는 것입니다. 그것은 모든 함수가 그 안에서 중첩되는 모든 기능을 포함하여 엄격한 될 것이라고 선언합니다. 엄격를 존중 기능 범위, 그래서 엄격한 코드 및 별거 아닌 코드는 동일한 파일에 혼합 수 있습니다. 이 두 번째 양식은 매우 잘 작동하는 모듈 패턴 과 다양한 유사. 그것이 결합 위험을 피할 수 있기 때문에 두 번째 양식을 선호합니다.

  (함수 () {
    "엄격한을 사용";
    / /이 함수 엄격 ...
 } ());

 (함수 () {
    / /하지만이 기능은 별거는 ...
 } ()); 

범위

역사적으로, JavaScript는 함수 범위가 얼마나 혼란되었습니다. 때로는 정적 범위가 될 것 같다,하지만 일부 기능들은 동적 범위가처럼 행동합니다. 이것은 읽고 이해하기 어려운 프로그램을 만드는 혼동된다. 오해는 버그가 발생합니다. 또한 성능 문제입니다. 정적 범위 지정은 컴파일 시간에 발생하는 변수 바인딩을 허용하는 것이지만, 역동적인 범위에 대한 요구 사항은 구속력이 상당한 성능 처벌 함께 제공되는 런타임에 연기해야​​ 의미합니다.

엄격한 모드는 모든 변수 바인딩을 정적으로 할 것을 요구합니다. 그 기능이 이전에 필요한 동적 바인딩이 제거되거나 수정해야한다는 것을 의미합니다. 특히, 진술과이 제거되고, eval 는 호출자의 환경을 함부로 변경하는 함수의 기능이 심각하게 제한됩니다.

엄격한 코드의 장점 중 하나는 같은 도구는 것입니다 YUI 압축기는 그것을 처리할 때 더 나은 일을 할 수 있습니다.

묵시 전역 변수

자바 스크립트 전역 변수를 암시하고있다. 당신이 명시적으로 변수를 선언하지 않으면 전역 변수는 암시적으로 당신에게 선언합니다. 그들의 기본적인 가사 심부름의 일부를 소홀히 수 있기 때문에 이것은 초보자를 위해 쉽게 프로그래밍 있습니다. 그러나 그것은 훨씬 더 어려운 큰 프로그램의 관리를하게하고 상당히 신뢰성이 떨어집니다. 그래서 엄격 모드에서 묵시적 전역 변수는 더 이상 만들어지지 않습니다. 당신은 명시적으로 모든 변수를 선언해야합니다.

글로벌 누수

원인이 될 수 상황의 숫자가 있습니다 this 전역 객체에 바인딩되는가. 당신이 제공하는 것을 잊지 예를 들어, new 접두어를 생성자 함수를 호출하면 생성자가있어 this 대신 새 개체를 초기화의 글로벌 개체에 예기치 않게 구속되므로, 그 대신 자동 전역 변수로 조작합니다. 이러한 상황에서는 엄격 모드 대신에 바인딩됩니다 thisundefined 생성자는 오류가 훨씬 더 빨리 감지할 수 있도록하는 대신 예외를 던질 원인이됩니다.

시끄러운 실패

자바 스크립트는 항상 읽기 전용 속성을 가지고있다지만, ES5의 때까지 그들에게 자신을 만들 수 없습니다 Object.createProperty 기능은 그 기능을 노출. 당신이 읽기 전용 속성에 값을 할당하는 경우, 그것은 자동으로 실패합니다. 과제는 속성의 값을 변경 않을 수 있지만했던 것처럼 당신의 프로그램이 진행합니다. 이것은 프로그램이 일관성없는 상태로 이동시킬 수있는 무결성 위험이다. 엄격 모드에서는 읽기 전용 속성을 변경하려고 시도하면 예외를 던질 것입니다.

팔진법

단어 크기 3의 배수있었습니다 머신에서 기계 수준의 프로그래밍을 수행할 때 숫자의 진수 (또는 기본 8) 표현은 매우 유용했습니다. 60 비트 단어 크기를 가지고 CDC 6600 메인 프레임, 작업 때 진수가 필요했습니다. 당신 진수를 읽을 수있다면, 20 자리 숫자와 같은 단어를 볼 수 있습니다. 두 자리 작전 코드를 표현, 8 레지스터 중 하나가 자리 식별​​ 하나. 기계 코드로부터 높은 수준의 언어로 느린 전환하는 동안, 그것은 프로그래밍 언어로 진수 양식을 제공하는 것이 유용할 것으로 생각되었다.

C에서 octalness의 극히 불행한 표현이 선택되었습니다 : 최고 영. 그럼 C에서, 0100는 64이 아닌 100을 의미하고, 08 오류가 아니라 8이다. 심지어 더 불행하게도,이 시대 착오는 그것에만 오류를 만드는 데 사용되는 자바 스크립트를 포함한 거의 모든 현대 언어에 복사되었습니다. 그것은 다른 목적이 없습니다. 그래서 엄격 모드에서 진수 양식이 더 이상 허용되지 않습니다.

등등

arguments 의사 배열 ES5에 배열처럼 조금 더된다. 엄격 모드에서는 그것은 잃는 calleecaller 속성을. 이렇게하면 여러분의 합격을하게 arguments 기밀 문맥을 많이 포기하지 않고 신뢰할 수없는 코드. 또한, arguments 기능 속성은 제거됩니다.

엄격 모드에서는 리터럴 함수에서 키 구문 오류를 생성합니다 중복. 함수는 같은 이름으로 두 개의 매개 변수를 가질 수 없습니다. 함수는 매개 변수 중 하나와 동일한 이름을 가진 변수를 가질 수 없습니다. 기능은 없다 delete 자체 변수. 하기위한 시도를 delete 하지 않는 구성 속성은 현재 예외를 throw합니다. 원시 값이 암묵적으로 포장하지 않습니다.

프로그램이 통과하는 경우 JSLint , 아마 엄격 모드에서 작동합니다.

그것은 여전히​​ 불완전해 세계입니다

엄격 모드가 해결되지 않는 자바 스크립트의 문제는 여전히 있습니다. 예를 들어, 세미콜론 삽입은 여전히 위험하고, 0.1입니다 + 0.2가 여전히 0.3과 동일하지 않습니다. 이러한 문제의 정정은 향후 버전 기다려야 할 것이다.

왜 엄격 모드 사항

프로그램의 신뢰성과 가독 대한 분명한 이점 외에도 엄격한 모드는 매시업 문제를 해결하는 데 도움이됩니다. 우린 그 코드가에게 브라우저를 인계하거나 사용자 또는 서버에 자체를 허위로하는 라이센스를 제공하지 않아도, 우리와 우리 사용자에게 유용한 일을하기 위해 페이지에 타사 코드를 초대하고 싶습니다. 우리는 타사 코드를 제한해야합니다. 같은 시스템 구글의 Caja는 하지만, 성능과 불편에 상당한 비용이 해. 내 자신의 ADsafe의 시스템은 또한이 일을하지만, 제거의 비용 this[] 입양 어렵게 만들 수 언어에서 subscripting 있습니다. 엄격한 모드는 우리 ADsafe와 Caja의 표현력의 편리함과 성능으로 타사 코드를 만들 수 있습니다. 저희 사이트는보다 복잡하게하고 더 많은 연결로 이것은 매우 중요한 것입니다.

엄격한 모드는 XSS 문제가 해결되지 않습니다. 그 문제에 대한 해결책에 따라 몇 가지 긍정적인 조치를 취할 W3C .

ES5/strict은 미리보기에서 지금이고, 곧 어디서나 모든 표준 호환 브라우저에서 표준 장비됩니다.

공유하고 확장할 수 : del.icio.us에 북마크 | 디그 그것! | reddit!

20 코멘트

  1. 평소 멋진 포스트처럼! ES5는 미래 .. Object.create (), Object.defineProperty (), Object.isExtensible (), Array.isArray (), JSON에 대한 네이티브 지원이 큰 특징입니다 .. ADsafe 체크 아웃, 전도 유망하게 보이는

    댓글 작성자 Sebastiano Armeli - 2010년 12월 14일 #을

  2. arguments.callee가있다면 몸에서 람다를 참조하는 다른 방법이 있나?

    댓글 작성자 Arieh - 2010년 12월 15일 #

  3. 완벽하게 엄격 모드 준수하는 브라우저 (베타하거나 아님)가 있습니까?

    네이트 의해 코멘트 - 2010년 12월 15일 #

  4. @ Arieh, 옙 -

    var carl = function bob(a) {
    if (!a) { bob(1); } // reference scoped to inside this function
    alert(carl === bob); // gotcha - true in all browsers but false in ie...
    };

    댓글 작성자 크리스 - 2010년 12월 15일 #

  5. Arieh : 당신은 함수 표현식의 이름을 지정하고 그 이름하여 참조할 수 있습니다. 예 : var x = function lookMaNoYCombinator(a, b) { if (a === 0) return a + b; else return lookMaNoYCombinator(a - 1, b) }

    댓글 작성자 사미어 Samhuri 2010년 12월 15일 - #

  6. @ Arieh : 당신이 재귀 원할 경우 명명된 람다를 사용해야합니다. 예. (함수 F () {F ()}). 이 | 이것은 또한 인수에 대해 반대하지 바인딩의 장점이 있습니다 |

    댓글 작성자 올리버 - 2010년 12월 15일 #

  7. @ 네이트 : 웹킷과 파이어 폭스의 야간 빌드 모두 엄격 모드 준수해야하고, 우리는 모두 당신이 찾아내는 경우에 버그가 제기되고 고맙겠 어떤 (시 http://bugs.webkit.orghttp://bugs.mozilla.org)

    댓글 작성자 올리버 - 2010년 12월 15일 #

  8. 다양한 브라우저에서 ES5 호환성을 보여주는 좋은 차트가 여기에서 찾아보실 수 있습니다 : http://kangax.github.com/es5-compat-table/

    댓글 작성자 지미 - 2010년 12월 15일 #

  9. 그리고 건강 검진 보고서를 주입 '과' 진짜 동적 바인딩을 구현하지 않았다 . 비록 완전한 ES3는 모든 경우에 어휘 바인딩 (반드시 정적 바인딩을하지 않았지만)를 사용합니다. 이러한 기능은 분명하지만, 착각했습니다.

    2010년 12월 16일 - 데이비드 - 사라 Hopwood 댓글 작성자 #

  10. 더글러스 안녕하세요,

    좋은 개요, 감사합니다. 또한, 당신의 독자가 자세한 엄격한 모드 설명에 관심을 가질만한 확신 : http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/

    PS : 추가 / 수정 한 쌍의 :

    함수는 매개 변수 중 하나와 동일한 이름을 가진 변수를 가질 수 없습니다.

    그것은 인자 중 하나와 같은 이름을 가진 변수 선언을 가지고 괜찮아요. 아직 인자 바인딩을 통해 선언된 것 때문에 기술적으로 선언은 그냥 생략됩니다.

    기능은 자체적으로 변수를 삭제할 수 없습니다.

    너무 항상 - 변수 (사용하여 만든 어떤 이들 제외한 eval 컨텍스트)를 항상 ES3 /에 {DontDelete}이 [[구성]] = ES5에 허위. 즉 그것은 상관없이 엄격 모드 변수를 삭제할 수 없습니다.

    드미트리.

    댓글 작성자 드미트리 A. Soshnikov 2010년 12월 17일 - #

  11. YUI3는 모듈에 "엄격한 사용"추가됩니까?

    데이비드에 의해 코멘트 - 2010년 12월 17일 #을

  12. 안녕 더글라스,

    나는 귀하의 게시물에서 문장 아래에 혼란 스러워요.

    "엄격한 모드는 모든 변수 바인딩을 정적으로 할 것을 요구합니다. 그것은 "기능이 이전에 필요한 동적 바인딩이 제거되거나 수정해야한다는 것을 의미

    키워드 "이"- 그것이 동적 (정적) 바인딩이나 어휘 구속력이 있습니까?

    그것이 동적 바인딩을 갖는 경우, 당신은 우리가 엄격한 모드에서 '이'사용을 중지해야 그 말의 뜻하나요?

    정말 혼란 스러워요. 당신의 비디오 프레 젠 테이션에서 마지막 한 달의 JavaScript를 학습 시작했습니다. 그들은 매우 매우 도움이됩니다. 이것은 내 첫 프로그래밍 언어입니다. 내 의심 여기 정말 이상있을 수 있습니다.

    그러나 단지 '이'의혹에 당신에게서 듣고 싶어요.

    감사

    댓글 작성자 ekanna - 2010년 12월 28일 #을

  13. 엄격 모드에서는 메서드 양식은 이전과 객체에게 바인딩합니다. 함수 형태는 정의되지 않은이 아니라 글로벌 객체에 이것을 바인딩합니다.

    댓글 작성자 더글러스 Crockford - 2010년 12월 29일 #을

  14. 드미트리, 당신은 단지 당신이 그때 삭제할 수있는 변수를 만들 수있는 사건을 묘사! delete 연산자의 구문은 그 사건에 대한 정확한 변수를 허용합니다. 하지만 더 이상은 아니야.

    그리고 데이비드 - 사라, 분할있는 머리카락은 아주 짧습니다.

    댓글 작성자 더글러스 Crockford - 2010년 12월 29일 #을

  15. 더글라스 감사합니다.

    댓글 작성자 ekanna - 2011년 1월 7일 #

  16. "시끄러운 실패"에 오타 수정 할 수 있습니다 섹션 - "createProperty는" "defineProperty"이어야합니다.

    트래비스에 의해 코멘트 - 2011년 1월 11일 #

  17. "엄격하게 끝내"

    프란츠 enzenhofer에 의해 코멘트 - 2011년 1월 13일 #

  18. Crockford rockz!

    마크 드라코에 의해 코멘트 - 2011년 1월 20일 #

  19. 어쨌든, 언제 YUI 압축기는 "엄격한 사용"을 놓기가 중단됩니다; minifaction 동안 코드에서에서 Pragma? :)

    댓글 작성자 marcoos - 2011년 2월 3일 #을

  20. S / minifaction / minification /

    댓글 작성자 marcoos - 2011년 2월 3일 #을

죄송합니다, 코멘트 양식은이 시간에 문을 닫습니다.

야후 주최

저작권 © 2006년부터 2012년까지 야후 주식 회사 판권 소유. 개인 정보 보호 정책 - 서비스 약관

에서 제공하는 워드 프레스 에서 야후! 웹 호스팅 .