无论如何,要检查严格模式是否使用了“ use strict”,并且我们要为严格模式执行不同的代码,并为非严格模式执行其他代码。寻找像isStrictMode();//boolean
无论如何,要检查严格模式是否使用了“ use strict”,并且我们要为严格模式执行不同的代码,并为非严格模式执行其他代码。寻找像isStrictMode();//boolean
Answers:
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
不会在外部上下文中引入新变量的事实。
--use_strict
标志的NodeJS 10 REPL中均可使用。
function isStrictMode() {
try{var o={p:1,p:2};}catch(E){return true;}
return false;
}
看来您已经有了答案。但是我已经写了一些代码。所以在这里
this
是的'undefined'
,当您处于严格模式时,它是全局方法中的一种。
function isStrictMode() {
return (typeof this == 'undefined');
}
更优雅的方式:如果“ 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 )
}
此处有许多答案都声明了一个用于检查严格模式的函数,但是这样的函数不会告诉您有关它从哪个范围被调用的信息,只会告诉您它在其中声明的范围!
function isStrict() { return !this; };
function test(){
'use strict';
console.log(isStrict()); // false
}
与跨脚本标记调用相同。
因此,每当需要检查严格模式时,都需要在该范围内编写整个检查:
var isStrict = true;
eval("var isStrict = false");
与最不赞成的答案不同,Yaron的这项检查不仅在全球范围内有效。
return this === undefined
,它不是将其与全局对象进行比较,而只是检查是否this
存在。