86

Is there anyway to check if strict mode 'use strict' is enforced , and we want to execute different code for strict mode and other code for non-strict mode. Looking for function like isStrictMode();//boolean

Bhargav Rao
  • 45,811
  • 27
  • 120
  • 136
Deepak Patil
  • 3,189
  • 3
  • 22
  • 22

7 Answers7

116

The fact that this inside a function called in the global context will not point to the global object can be used to detect strict mode:

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
ThiefMaster
  • 298,938
  • 77
  • 579
  • 623
  • 5
    For clarification, the return statement is equivalent to `return this === undefined`, it's not comparing it to the global object, it's just checking if `this` exists. – aljgom Mar 15 '17 at 21:40
31

I prefer something that doesn't use exceptions and works in any context, not only global one:

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

It uses the fact the in strict mode eval doesn't introduce a new variable into the outer context.

noseratio
  • 57,966
  • 24
  • 188
  • 459
26
function isStrictMode() {
    try{var o={p:1,p:2};}catch(E){return true;}
    return false;
}

Looks like you already got an answer. But I already wrote some code. So here

Ahmed Ashour
  • 4,462
  • 10
  • 33
  • 49
Thalaivar
  • 22,304
  • 5
  • 59
  • 68
  • 1
    This is better than Mehdi's answer as it will work everywhere, not only in a global scope. Upped. :) – mgol Aug 15 '12 at 23:45
  • 7
    This results in a syntax error, which happens before the code runs, so it can't be caught... – skerit Jun 28 '13 at 12:11
  • 6
    This will not work in ES6 either as the check is removed to allow computed property names. – billc.cn Jan 30 '15 at 10:22
  • 1
    Why should there be an error thrown in strict mode? – Buksy Aug 11 '16 at 06:31
  • 1
    @skerit Can you elaborate on your syntax error? I do not get one. – Robert Siemer Feb 25 '20 at 00:48
  • The spec and engines behavior have changed. Now this throws in old engines, but it does not throw in new engines. https://stackoverflow.com/questions/30617139/whats-the-purpose-of-allowing-duplicate-property-names – shitpoet Jul 29 '21 at 11:46
13

Yep, this is 'undefined' within a global method when you are in strict mode.

function isStrictMode() {
    return (typeof this == 'undefined');
}
noseratio
  • 57,966
  • 24
  • 188
  • 459
Mehdi Golchin
  • 7,733
  • 2
  • 29
  • 36
6

Warning + universal solution

Many answers here declare a function to check for strict mode, but such a function will tell you nothing about the scope it was called from, only the scope in which it was declared!

function isStrict() { return !this; };

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

Same with cross-script-tag calls.

So whenever you need to check for strict mode, you need to write the entire check in that scope:

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

Unlike the most upvoted answer, this check by Yaron works not only in the global scope.

potato
  • 895
  • 10
  • 18
5

More elegant way: if "this" is object, convert it to 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 )
}
0

Another solution can take advantage of the fact that in strict mode, variables declared in eval are not exposed on the outer scope

function isStrict() {
    var x=true;
    eval("var x=false");
    return x;
}
Yaron U.
  • 7,311
  • 2
  • 30
  • 45