2012-05-07 1 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; 
} 

あなたはすでに回答があるようです。しかし、私はすでにいくつかのコードを書いています。それはに新しい変数を導入しないevalでstrictモード事実を使用しています

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

:だからここ

+1

メドーの答えよりも優れています。グローバルな範囲だけでなく、どこでも使えるからです。アップした。 :) – mgol

+7

これは、コードが実行される前に起こる構文エラーになります。したがって、キャッチすることはできません。 – skerit

+3

これは、チェックが計算されたプロパティ名を許可するために削除されるため、ES6では機能しません。 –

16

私は例外を使用して任意のコンテキストで動作していない何か、だけでなく、グローバルなものを好みます外側の文脈

+0

好奇心の邪魔をして、2015年の防弾対策はこれで、ES6はここにありますか? –

+2

最新のchromeとnodejで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) 
} 
関連する問題