Gibt es eine Möglichkeit zu überprüfen, ob der strikte Modus erzwungen wird?

76

Gibt es sowieso zu überprüfen, ob der strikte Modus 'use strict' erzwungen wird, und wir möchten anderen Code für den strengen Modus und anderen Code für den nicht strengen Modus ausführen. Auf der Suche nach Funktion wieisStrictMode();//boolean

Deepak Patil
quelle

Antworten:

102

Die Tatsache, dass thisinnerhalb einer im globalen Kontext aufgerufenen Funktion nicht auf das globale Objekt verweist, kann verwendet werden, um den strengen Modus zu erkennen:

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

Demo:

> echo '"use strict"; var isStrict = (function() { return !this; })(); console.log(isStrict);' | node
true
> echo 'var isStrict = (function() { return !this; })(); console.log(isStrict);' | node
false
DiebMaster
quelle
3
Zur Verdeutlichung entspricht die return-Anweisung return this === undefined: Sie vergleicht sie nicht mit dem globalen Objekt, sondern prüft nur, ob sie thisvorhanden ist.
Aljgom
26

Ich bevorzuge etwas, das keine Ausnahmen verwendet und in jedem Kontext funktioniert, nicht nur in einem globalen:

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

Es nutzt die Tatsache, dass im strengen Modus evalkeine neue Variable in den äußeren Kontext eingeführt wird.

noseratio
quelle
Wie kugelsicher ist dies 2015 aus Neugier, jetzt, wo ES6 hier ist?
John Weisz
3
Ich überprüfe, ob es in ES6 auf den neuesten Chrome- und Nodejs funktioniert.
Michael Matthew Toomim
1
Nett! Funktioniert in NodeJS 10 REPL mit / ohne --use_strictFlag.
igor
25
function isStrictMode() {
    try{var o={p:1,p:2};}catch(E){return true;}
    return false;
}

Sieht so aus, als hättest du schon eine Antwort bekommen. Aber ich habe schon Code geschrieben. Also hier

Thalaivar
quelle
1
Dies ist besser als Mehdis Antwort, da es überall funktionieren wird, nicht nur in einem globalen Bereich. Aufgestockt. :)
mgol
7
Dies führt zu einem Syntaxfehler, der auftritt, bevor der Code ausgeführt wird, sodass er nicht abgefangen werden kann ...
Skerit
5
Dies funktioniert auch in ES6 nicht, da die Prüfung entfernt wird, um berechnete Eigenschaftsnamen zuzulassen.
billc.cn
Warum sollte im strengen Modus ein Fehler ausgegeben werden?
Buksy
@skerit Können Sie Ihren Syntaxfehler näher erläutern? Ich bekomme keinen.
Robert Siemer
12

Ja, thisbefindet sich 'undefined'innerhalb einer globalen Methode, wenn Sie sich im strengen Modus befinden.

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

Eleganter Weg: Wenn "dies" ein Objekt ist, konvertieren Sie es in "wahr"

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

quelle
3

Warnung + universelle Lösung

Viele Antworten hier deklarieren eine Funktion, die auf strengen Modus überprüft werden soll, aber eine solche Funktion sagt nichts über den Bereich aus, von dem aus sie aufgerufen wurde, sondern nur über den Bereich, in dem sie deklariert wurde!

function isStrict() { return !this; };

function test(){
  'use strict';
  console.log(isStrict()); // false
}

Gleiches gilt für Cross-Script-Tag-Aufrufe.

Wenn Sie also nach dem strengen Modus suchen müssen, müssen Sie den gesamten Scheck in diesem Bereich schreiben:

var isStrict = true;
eval("var isStrict = false");

Im Gegensatz zur am besten bewerteten Antwort funktioniert diese Überprüfung durch Yaron nicht nur im globalen Bereich.

Kartoffel
quelle
0

Eine andere Lösung kann die Tatsache ausnutzen, dass im strengen Modus deklarierte Variablen evalnicht im äußeren Bereich verfügbar gemacht werden

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