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

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


person Deepak Patil    schedule 07.05.2012    source источник


Ответы (7)


Тот факт, что 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
person ThiefMaster    schedule 07.05.2012
comment
Для пояснения, оператор return эквивалентен return this === undefined, он не сравнивает его с глобальным объектом, он просто проверяет, существует ли this. - person aljgom; 16.03.2017

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

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

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

person noseratio    schedule 20.09.2013
comment
Просто из любопытства, насколько это пуленепробиваемо в 2015 году, теперь, когда ES6 уже здесь? - person John Weisz; 18.07.2015
comment
Я проверяю, что он работает в ES6 на последних версиях Chrome и nodejs. - person Michael Matthew Toomim; 30.11.2016
comment
Хороший! Работает в NodeJS 10 REPL с/без флага --use_strict. - person igor; 16.01.2019

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

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

person Thalaivar    schedule 07.05.2012
comment
Это лучше, чем ответ Мехди, поскольку он будет работать везде, а не только в глобальном масштабе. Поднято. :) - person mgol; 16.08.2012
comment
Это приводит к синтаксической ошибке, которая возникает до запуска кода, поэтому ее нельзя отловить... - person skerit; 28.06.2013
comment
Это также не будет работать в ES6, так как проверка удалена, чтобы разрешить вычисляемые имена свойств. - person billc.cn; 30.01.2015
comment
Почему в строгом режиме должна быть ошибка? - person Buksy; 11.08.2016
comment
@skerit Можете ли вы уточнить свою синтаксическую ошибку? Я не получаю ни одного. - person Robert Siemer; 25.02.2020
comment
Спецификация и поведение двигателей изменились. Теперь это добавляет старые двигатели, но не добавляет новые двигатели. stackoverflow.com/ вопросы/30617139/ - person shitpoet; 29.07.2021

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

function isStrictMode() {
    return (typeof this == 'undefined');
}
person Mehdi Golchin    schedule 07.05.2012

Более элегантный способ: если "это" является объектом, преобразовать его в истину

"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 )
}
person Community    schedule 30.08.2016

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

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

function isStrict() { return !this; };

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

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

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

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

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

person potato    schedule 05.07.2020

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

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