Чи є спосіб перевірити, чи дотримується суворий режим?


76

Чи є який-небудь спосіб перевірити, чи дотримується суворий режим «використовувати строгий», і ми хочемо виконати інший код для суворого режиму та інший код для несуворого режиму. Шукаю функцію типуisStrictMode();//boolean

Відповіді:


103

Той факт, що 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

3
Для уточнення, оператор return еквівалентний return this === undefined, це не порівняння його з глобальним об'єктом, це просто перевірка, чи thisіснує.
aljgom

26

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

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

Він використовує той факт, що в суворому режимі evalне вводить нову змінну у зовнішній контекст.


Просто з цікавості, наскільки це було куленепробивно в 2015 році, коли ES6 тут?
John Weisz

3
Я перевіряю, чи працює він у ES6 на останніх версіях chrome та nodejs.
Michael Matthew Toomim

1
Приємно! Працює в NodeJS 10 REPL з --use_strictпрапором / без нього .
igor

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

Схоже, ви вже отримали відповідь. Але я вже написав якийсь код. Так ось


1
Це краще, ніж відповідь Мехді, оскільки вона працюватиме скрізь, не лише в глобальному масштабі. Піднято. :)
mgol

7
Це призводить до синтаксичної помилки, яка трапляється до запуску коду, тому її неможливо зловити ...
skerit

5
Це також не буде працювати в ES6, оскільки перевірка видалена, щоб дозволити обчислювані імена властивостей.
billc.cn

Чому в суворому режимі має бути помилка?
Buksy

@skerit Чи можете ви детальніше розповісти про свою синтаксичну помилку? Я не отримую.
Роберт Сімер,

12

Так, thisце 'undefined'всередині глобального методу, коли ви перебуваєте в суворому режимі.

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

5

Більш елегантний спосіб: якщо "це" є об'єктом, перетворіть його на істину

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

3

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

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

function isStrict() { return !this; };

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

Те саме з викликами між тегами.

Отже, коли вам потрібно перевірити суворий режим, вам потрібно написати весь чек у цій області:

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

На відміну від найголоснішої відповіді, ця перевірка Яроном працює не лише в глобальному масштабі.


0

Інше рішення може скористатися тим фактом, що в суворому режимі змінні, оголошені в eval, не виставляються на зовнішню область

function isStrict() {
    var x=true;
    eval("var x=false");
    return x;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.