Is er een manier om te controleren of de strikte modus wordt afgedwongen?

Is er een manier om te controleren of de strikte modus ‘gebruik strikt’ wordt afgedwongen, en we willen andere code uitvoeren voor de strikte modus en andere code voor de niet-strikte modus.
Op zoek naar een functie zoals isStrictMode();//boolean


Antwoord 1, autoriteit 100%

Het feit dat thisbinnen een functie die in de globale context wordt aangeroepen, niet naar het globale object verwijst, kan worden gebruikt om de strikte modus te detecteren:

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

Antwoord 2, autoriteit 26%

Ik geef de voorkeur aan iets dat geen uitzonderingen gebruikt en in elke context werkt, niet alleen een globale:

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

Het maakt gebruik van het feit dat de in strikte modus evalgeen nieuwe variabele in de uiterlijke context introduceert.


Antwoord 3, autoriteit 23%

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

Het lijkt erop dat je al een antwoord hebt gekregen. Maar ik heb al wat code geschreven. Dus hier


Antwoord 4, autoriteit 11%

Ja, thisis 'undefined'binnen een globale methode als je in de strikte modus bent.

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

Antwoord 5, autoriteit 4%

Elegantere manier: als “this” een object is, converteer het dan naar 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 )
}

Antwoord 6, autoriteit 4%

Waarschuwing + universele oplossing

Veel antwoorden hier verklaren een functie om te controleren op de strikte modus, maar zo’n functie vertelt je niets over het bereik waaruit het is aangeroepen, alleen het bereik waarin het is gedeclareerd!

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

Hetzelfde met cross-script-tag-aanroepen.

Dus wanneer u moet controleren op de strikte modus, moet u de hele controle in dat bereik schrijven:

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

In tegenstelling tot het meest gewaardeerde antwoord, werkt deze controle van Yaron niet alleen wereldwijd.


Antwoord 7

Een andere oplossing kan profiteren van het feit dat in de strikte modus variabelen die zijn gedeclareerd in evalniet zichtbaar zijn in de buitenste scope

function isStrict() {
    var x=true;
    eval("var x=false");
    return x;
}

Other episodes