2012-05-07 3 views

답변

62

전역 객체를 가리 키지 않습니다 글로벌 컨텍스트에서 호출 함수 내부 this가 엄격 모드 감지하는 데 사용할 수 있다는 사실 :

var isStrict = (function() { return !this; })(); 

데모 :

> echo '"use strict"; var isStrict = (function() { return !this; })(); console.log(isStrict);' | node 
true 
> echo 'var isStrict = (function() { return !this; })(); console.log(isStrict);' | node 
false 
+0

위대한로 변환. 이것은 우아하고 모든 곳에서 작동합니다. –

+0

설명을 위해 return 문은'return this === undefined'와 동일하며 전역 객체와 비교하지 않습니다. 단지'this'가 있는지 확인하는 것입니다. – aljgom

7

예, this'undefined'입니다.

function isStrictMode() { 
    return (typeof this == 'undefined'); 
} 
18
function isStrictMode() { 
    try{var o={p:1,p:2};}catch(E){return true;} 
    return false; 
} 

이미 답변을 얻은 것처럼 보입니다. 그러나 나는 이미 약간의 코드를 썼다. 그래서 여기

+1

이것은 세계적인 범위뿐만 아니라 모든 곳에서 작동하므로 Mehdi의 대답보다 낫습니다. 위. :) – mgol

+7

코드가 실행되기 전에 발생하는 구문 오류가 발생하여 잡히지 않습니다. – skerit

+3

계산 된 속성 이름을 허용하기 위해 검사가 제거되므로 ES6에서도 작동하지 않습니다. –

16

내가 어떤 상황에서 예외를 사용하여 작동하지 않는 것을 선호뿐만 아니라 글로벌 한 :

var mode = (eval("var __temp = null"), (typeof __temp === "undefined")) ? 
    "strict": 
    "non-strict"; 

그것은에 새로운 변수를 도입하지 않는 eval 엄격 모드에서 사실을 사용 외부 문맥.

+0

호기심에서 벗어나 2015 년에 방탄복이 얼마나 ES6가 여기에 오게 되었습니까? –

+2

최신 크롬 및 노드에 대한 ES6에서 작동하는지 확인합니다. –

+1

우아하고 일하고 있습니다, 고마워요! – rudyryk

1

더 우아한 방법 : "이"개체 인 경우, 사실

"use strict" 

var strict = (function() { return !!!this })() 

if (strict) { 
    console.log ("strict mode enabled, strict is " + strict) 
} else { 
    console.log ("strict mode not defined, strict is " + strict) 
}