Есть ли способ проверить, применяется ли строгий режим?
Есть ли в любом случае, чтобы проверить, принудительно ли используется строгий режим '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;
}