有什么方法可以检查是否执行严格模式?


Answers:


102

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不会在外部上下文中引入新变量的事实。


出于好奇,现在有了ES6,这在2015年会有多大的防弹能力?
约翰·威茨

3
我确认它可以在最新的chrome和nodejs的ES6中使用。
Michael Matthew Toomim '16

1
真好!带有/不带有--use_strict标志的NodeJS 10 REPL中均可使用。
igor

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

看来您已经有了答案。但是我已经写了一些代码。所以在这里


1
这比Mehdi的回答更好,因为它不仅可以在全球范围内使用,而且可以在任何地方使用。向上。:)
mgol

7
这会导致语法错误,该错误会在代码运行之前发生,因此无法捕获...
skerit 2013年

5
这在ES6中也不起作用,因为删除了检查以允许计算出的属性名称。
billc.cn 2015年

为什么在严格模式下会引发错误?
2016年

@skerit您能详细说明一下语法错误吗?我没有一个。
罗伯·西默


5

更优雅的方式:如果“ 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 )
}

3

警告+通用解决方案

此处有许多答案都声明了一个用于检查严格模式的函数,但是这样的函数不会告诉您有关它从哪个范围被调用的信息,只会告诉您它在其中声明的范围!

function isStrict() { return !this; };

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

与跨脚本标记调用相同。

因此,每当需要检查严格模式时,都需要在该范围内编写整个检查:

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

与最不赞成的答案不同,Yaron的这项检查不仅在全球范围内有效。


0

另一个解决方案可以利用以下事实:在严格模式下,在eval中声明的变量不会在外部范围内公开

function isStrict() {
    var x=true;
    eval("var x=false");
    return x;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.