Есть ли способ проверить, применяется ли строгий режим 'use strict', и мы хотим выполнить другой код для строгого режима и другой код для нестрогого режима. Ищу функцию типа isStrictMode();//boolean
Есть ли способ проверить, применяется ли строгий режим?
Ответы (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
return this === undefined
, он не сравнивает его с глобальным объектом, он просто проверяет, существует ли this
.
- person aljgom; 16.03.2017
Я предпочитаю то, что не использует исключения и работает в любом контексте, а не только в глобальном:
var mode = (eval("var __temp = null"), (typeof __temp === "undefined")) ?
"strict":
"non-strict";
Он использует тот факт, что в строгом режиме eval
не вводит новую переменную во внешний контекст.
--use_strict
.
- person igor; 16.01.2019
function isStrictMode() {
try{var o={p:1,p:2};}catch(E){return true;}
return false;
}
Похоже, вы уже получили ответ. Но я уже написал код. Так вот
Да, this
это 'undefined'
в глобальном методе, когда вы находитесь в строгом режиме.
function isStrictMode() {
return (typeof this == 'undefined');
}
Более элегантный способ: если "это" является объектом, преобразовать его в истину
"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 )
}
Предупреждение + универсальное решение
Многие ответы здесь объявляют функцию для проверки строгого режима, но такая функция ничего не скажет вам о области, из которой она была вызвана, только о области, в которой она была объявлена!
function isStrict() { return !this; };
function test(){
'use strict';
console.log(isStrict()); // false
}
То же самое с вызовами кросс-скриптов.
Поэтому всякий раз, когда вам нужно проверить строгий режим, вам нужно написать всю проверку в этой области:
var isStrict = true;
eval("var isStrict = false");
В отличие от ответа с наибольшим количеством голосов, эта проверка Ярона работает не только в глобальном масштабе.
Другое решение может использовать тот факт, что в строгом режиме переменные, объявленные в eval
, не отображаются во внешней области.
function isStrict() {
var x=true;
eval("var x=false");
return x;
}