web-dev-qa-db-fra.com

Existe-t-il un moyen de vérifier si le mode strict est appliqué?

Est-il possible de vérifier si le mode strict 'use strict' est appliqué, et nous voulons exécuter un code différent pour le mode strict et un autre code pour le mode non strict. Recherche d'une fonction comme isStrictMode();//boolean

58
Deepak Patil

Le fait que this à l'intérieur d'une fonction appelée dans le contexte global ne pointe pas vers l'objet global peut être utilisé pour détecter le mode strict:

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

Démo:

> echo '"use strict"; var isStrict = (function() { return !this; })(); console.log(isStrict);' | node
true
> echo 'var isStrict = (function() { return !this; })(); console.log(isStrict);' | node
false
80
ThiefMaster
function isStrictMode() {
    try{var o={p:1,p:2};}catch(E){return true;}
    return false;
}

On dirait que tu as déjà eu une réponse. Mais j'ai déjà écrit du code. Alors voici

23
Thalaivar

Je préfère quelque chose qui n'utilise pas d'exceptions et fonctionne dans n'importe quel contexte, pas seulement global:

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

Il utilise le fait qu'en mode strict eval n'introduit pas une nouvelle variable dans le contexte externe.

20
noseratio

Oui, this est 'undefined' dans une méthode globale lorsque vous êtes en mode strict.

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

Manière plus élégante: si "this" est un objet, convertissez-le en vrai

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

Une autre solution peut tirer parti du fait qu'en mode strict, les variables déclarées dans eval ne sont pas exposées dans l'étendue externe.

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