2010-02-26 2 views
39

strict 모드 pragma의 범위는 ECMAScript5에서 어떤 범위입니까?ECMAScript5에서 "엄격한 사용"의 범위는 무엇입니까?

"use strict"; 

(JSLint 그것에 대해 불평하지 않습니다 주로 때문에) 나는이 일을하고 싶습니다 :

"use strict"; 

(function() { 
    // my stuff here... 
}()); 

하지만 그건 다른 코드를 끊거나하지 않는다면 잘 모르겠어요. 나는,이 작업을 수행 할 수 있다는 것을 알고 범위 함수의 프라그를 할 ...

(function() { 

    "use strict"; 

    // my stuff here... 

}()); 

하지만 (이하 "엄격한"JSLint 옵션이 활성화 된 경우) 당신이 코드를 실행하고 생각하기 때문에 JSLint는 그것에 대해 불평 '엄격한 사용'을 사용 설정하기 전에

여기 내 질문이 있습니다.

"use strict"; 
// do some stuff 

및 fileB.js : 나는 fileA.js 경우

eval(somecodesnippet); // disallowed by "use strict" 

을 한 후 같은 순서로 내 HTML 페이지에 포함, 프라 그마는 파일 범위, 또는 의지됩니다 pragma가 fileB로 흘러 들어가서 eval 실행을 차단합니까?

+0

A면 주 : Douglad Crockford의 "Javascript의 주와 미래"에 대한 프레젠테이션은 정말 훌륭했습니다. 이야기 끝에서 엄격합니다. 다음은 링크입니다 : http://www.infoq.com/presentations/The-State-and-Future-of-JavaScript –

+0

''eval()'은 use strict로 허용되며 전역 적으로 범위가 지정됩니다. –

답변

2

EDIT 잘못된 것처럼 보입니다. Jeff Walden's answer below을 참조하십시오.

체크 아웃 관련 질문이 대답 : 당신은 단지 그 함수가 엄격 모드로하려면 JSLint의 불만에도 불구하고 What does "use strict" do in JavaScript, and what is the reasoning behind it?

, 당신은 (그리고 해야)는 함수의 내부 "use strict";을 사용할 수 있습니다. 전역 컨텍스트에서 사용하면 모든 코드가 엄격 모드로 강제 설정됩니다. 짧은 대답 : 예, 사용을 차단합니다 eval.

+2

이 답변은 잘못되었습니다. 'fileA.js'의 맨 위 지시어를 사용하면 그 파일의 전체가 strict 모드가되지만, HTML 페이지에 포함 된 순서에 관계없이'fileB.js'가 엄격 모드가되는 것은 아닙니다 . 게다가'eval()'은 엄격 모드에서 다르게 작동하지만 여전히 작동합니다. 그것은 "차단"되지 않습니다. –

54

"use strict"은 기능 또는 프로그램 범위에만 적용됩니다. 따라서 상단에 인 fileA.js가 있으면 fileA.js는 엄격 모드로 실행되며 정의 된 모든 함수는 호출시 동일하게 수행됩니다. 그러나 fileB.js는 별도의 프로그램이므로 fileA.js의 "use strict"은 이에 적용되지 않습니다. 따라서 fileB.js는 비 엄격 모드로 실행됩니다. (물론 somecodesnippet"use strict" 지시어로 시작하고 올바르게 구문 분석하면 해당 코드는 엄격 모드로 실행되며 해당 코드로 정의 된 함수도 마찬가지로 수행됩니다.) 엄격 성은 절대적으로 "흘림"하지 않으며 ES5 4.2.2 필자는 비 규범 적이지만, 필요한 경우이를 위해 규범 적 참조를 파헤칠 수 있음을 확신한다.) 구현은 무제한 및 엄격 모드 코드 단위의 조합을 단일 복합 프로그램으로 지원해야한다.

하나의 문제 : 전체 범위에서 엄격 모드를 사용하는 경우가 있지만 항상 그런 것은 아니지만 더 이상 스크립트를 단일 파일로 연결할 수 없습니다. 스크립트 A, B, C, D가 순서대로 있다고 가정하십시오. A가 엄격하면 B/C/D가 아니더라도 전체 연결이 엄격합니다. 반대로 A가 엄격하지 않고 비어 있지 않은 경우 B/C/D가 엄격한 경우에도 전체 연결은 엄격하지 않습니다. 이것은 이미 적어도 하나의 얼리 어답터 사이트를 물 렸습니다.

모두 엄격한 모드는 eval을 금지하지 않습니다.eval이 엄격한 모드에서 정상적인 방법으로 호출 될 때 eval(code [, ...]) 형태의 프로그램 구문을 사용하면 code이 항상 code이 아니더라도 항상 eval과 같은 방식으로 동작하는 "직접"평가판입니다. "use strict" 지시문으로 시작하고 코드로 작성된 모든 변수가 기존 변수와 별도의 별도 저장 영역에 보관된다는 점을 제외하고는 (정확한 의미는 약간 복잡하고, 필자는 파이어 폭스의 자바 스크립트 엔진을 사용하여 늦게 구현했으며, 스펙에 상당한 시간이 걸리더라도 여전히 구현이 쉽지 않다.)

그런 식으로 전화하지 않는 경우 - eval.call(...), setTimeout(eval, ...), setInterval(eval, ...), var ev = eval; ev(...); 등 - "간접적 인"평가판입니다. 간접 평가 (내부 또는 외부 엄격 모드)는 조금 다르게 작동합니다. 이름 확인 및 변수 정의는 전역 범위에서와 동일하게 발생합니다. (코드는 "use strict" 지시어로 시작하는 경우에만 엄격 모드 코드로 실행됩니다.)

엄격 모드 지원은 거의 최신이지만 Firefox nightlies으로 완료되었지만 완전히 다운로드되지는 않았습니다. 따라서 하나를 다운로드 할 가치가있을 수 있습니다. 구현되는 엄격 모드의 부분들과 함께. 아직까지는 프로덕션 사용을 중단하라는 말을 할 것입니다.하지만 실험을 위해 확실히 준비가되어 있습니다 (엄격 모드가 아직 완전히 이해되지 않은 경우). (Sean McMillan의 링크에 대해서는 "지원"에 대한 주장은 각 탄환에 필요한 최소한의 기능을 나타냄을 유의하십시오 엄격 모드 테스트는 훨씬 엄격합니다.)

+4

'엄격함은 절대적으로 "흘림"하지 않습니다. - 이것은 완전히 정확하지 않습니다. 엄격하지 않은 코드에서 사용하는 함수가 엄격 모드로 정의되었을 때'.caller'를 사용할 수 없습니다. 그래서 엄격하지 않은 코드는 다른 코드가 엄격 모드에 있기 때문에 실제로 중단 될 수 있습니다. 나는 그 출혈을 고려할 것입니다. – AndreKR

+1

원래의 질문이 표현 된 방식으로, 나는 "흘림"을 어휘 적, 텍스트 적 소스 코드에서 - 스크립트 A가 엄격함 자체를 엄격하게 선택하지 않고 스크립트 A에서 엄격함을 얻는 것을 의미하는 것으로 해석했습니다. 분명히 스크립트의 효과 (엄격함으로 인한 영향 포함)가 눈에 보입니다 - 다른 스크립트에서는 "흘림"이라고 말할 수 있습니다.효과의 * 특성 *은 트리거 스크립트의 엄격함에 따라 다를 수 있습니다. 그러나 엄격한 또는 아니요, 스크립트의 효과는 다른 스크립트에서 볼 수 있습니다. 그것은 나에게 "흘림"의 특히 유용한 정의로 보이지 않습니다. –

0
eval(somecodesnippet); // disallowed by "use strict" 

이전에 somecodesippippet를 선언 한 경우가 아닙니다.

var somecodesnippet = "여기 멋진 코드 모음";

eval (somecodesnippet); // "엄격한 사용"에 의해 허용되지

0

전체 파일 :

<script...> 
    "use strict"; 

또는

전체 기능과 임베디드 기능, 예를 들어 :

function fn(){ 
    "use strict"; 
+0

OP 문제를 해결하는 이미 대답이 있습니다. 너의 것이 더 이상 품질을 추가하지 않습니다. –

관련 문제