web-dev-qa-db-ja.com

ストリクトモードが適用されているかどうかを確認する方法はありますか?

とにかく、厳格モード 'use strict'が適用されているかどうかをチェックする必要がありますか?厳格モード用の異なるコードと非厳格モード用の他のコードを実行したいと思います。 isStrictMode();//booleanのような関数を探しています

70
Deepak Patil

グローバルコンテキストで呼び出された関数内の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
85
ThiefMaster

私は例外を使用せず、グローバルなものだけでなく、あらゆるコンテキストで機能するものが好きです:

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

これは、厳密モードevalでは外部変数に新しい変数が導入されないという事実を使用しています。

24
noseratio
function isStrictMode() {
    try{var o={p:1,p:2};}catch(E){return true;}
    return false;
}

すでに回答を得ているようです。しかし、私はすでにいくつかのコードを書きました。だからここ

24
Thalaivar

はい、this'undefined'厳密モードの場合、グローバルメソッド内。

function isStrictMode() {
    return (typeof this == 'undefined');
}
10
Mehdi Golchin

よりエレガントな方法:「this」がオブジェクトの場合、それをtrueに変換します

"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 )
}
3
user6748331

別の解決策は、厳密モードでは、evalで宣言された変数が外部スコープで公開されないという事実を利用できます。

function isStrict() {
    var x=true;
    eval("var x=false");
    return x;
}
0
Yaron U.