Есть ли способ проверить, применяется ли строгий режим?

Есть ли в любом случае, чтобы проверить, принудительно ли используется строгий режим 'use strict', и мы хотим выполнить другой код для строгого режима и другой код для нестрогого режима. Ищу функцию как isStrictMode();//boolean

6 ответов

Решение

Дело в том, что 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

Я предпочитаю что-то, что не использует исключения и работает в любом контексте, не только глобальном:

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

Он использует тот факт, что в строгом режиме eval не вводит новую переменную во внешний контекст.

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

Похоже, вы уже получили ответ. Но я уже написал некоторый код. Так вот

Ага, this является 'undefined' в глобальном методе, когда вы находитесь в строгом режиме.

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

Предупреждение + универсальное решение

Во многих ответах здесь объявляется функция для проверки строгого режима, но такая функция ничего не скажет вам об области действия, из которой она была вызвана, только об области, в которой она была объявлена!

function isStrict() { return !this; };

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

То же самое и с вызовами кросс-скриптовых тегов.

Поэтому всякий раз, когда вам нужно проверить строгий режим, вам нужно написать всю проверку в этой области:

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

В отличие от ответа, получившего наибольшее количество голосов, эта проверка Ярона работает не только в глобальном масштабе.

Более элегантный способ: если "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 )
}

Другое решение может использовать тот факт, что в строгом режиме переменные, объявленные в eval не выставлены на внешнюю область

function isStrict() {
    var x=true;
    eval("var x=false");
    return x;
}
Другие вопросы по тегам