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
function isStrictMode() { try{var o={p:1,p:2};}catch(E){return true;} return false; }похоже, вы уже получили ответ. Но я уже написал какой-то код. Так вот
Я предпочитаю то, что не использует исключений и работает в любом контексте, а не только глобальный:
var mode = (eval("var __temp = null"), (typeof __temp === "undefined")) ? "strict": "non-strict";он использует факт в строгом режиме
evalне вводит новую переменную во внешний контекст.
Да,
thisи'undefined'в глобальном методе, когда вы находитесь в строгом режиме.function isStrictMode() { return (typeof this == 'undefined'); }
более элегантный способ: если" это " является объектом, преобразуйте его в 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; }
Comments