84

无论如何要检查是否强制执行严格模式“使用严格”,我们想为严格模式执行不同的代码,为非严格模式执行其他代码。寻找类似的功能isStrictMode();//boolean

4

7 回答 7

115

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
于 2012-05-07T10:08:11.907 回答
30

我更喜欢不使用异常并且在任何情况下都可以使用的东西,而不仅仅是全局的:

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

它使用了 in strict 模式eval不会将新变量引入外部上下文的事实。

于 2013-09-20T12:26:27.693 回答
26
function isStrictMode() {
    try{var o={p:1,p:2};}catch(E){return true;}
    return false;
}

看起来你已经得到了答案。但是我已经写了一些代码。所以在这里

于 2012-05-07T10:36:33.710 回答
12

是的,当您处于严格模式时,this它在全局方法中。'undefined'

function isStrictMode() {
    return (typeof this == 'undefined');
}
于 2012-05-07T10:07:40.007 回答
6

警告+通用解决方案

这里的许多答案都声明了一个检查严格模式的函数,但是这样的函数不会告诉你它被调用的范围,只会告诉你它被声明的范围!

function isStrict() { return !this; };

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

与跨脚本标签调用相同。

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

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

与最受欢迎的答案不同,Yaron 的这项检查不仅适用于全球范围。

于 2020-07-05T04:18:46.477 回答
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 )
}
于 2016-08-30T10:42:24.833 回答
0

另一种解决方案可以利用这样一个事实,即在严格模式下,声明的变量eval不会暴露在外部范围内

function isStrict() {
    var x=true;
    eval("var x=false");
    return x;
}
于 2018-06-23T10:18:04.997 回答