2012-05-07 54 views

回答

62

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 
+0

大。这是优雅和无处不在。 –

+0

为了澄清,return语句相当于'return this === undefined',它不会将它与全局对象进行比较,它只是检查'this'是否存在。 – aljgom

7

没错,this'undefined'一个全球性的方法中,当你在严格模式。

function isStrictMode() { 
    return (typeof this == 'undefined'); 
} 
18
function isStrictMode() { 
    try{var o={p:1,p:2};}catch(E){return true;} 
    return false; 
} 

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

+1

这比Mehdi的答案好,因为它可以在任何地方工作,不仅在全球范围内。调升。 :) – mgol

+7

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

+3

这不适用于ES6,因为检查已删除以允许计算属性名称。 –

16

我喜欢的东西并不在任何情况下使用异常和作品,不仅是全球一个:

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

它采用严格模式的事实eval没有引入新的变量进入外部环境。

+0

出于好奇,2015年该如何防弹,现在ES6在这里了? –

+2

我验证它可以在ES6上的最新chrome和nodejs上运行。 –

+1

优雅和工作,谢谢! – rudyryk

1

更优雅的方式:如果 “这” 对象,将其转换为真正的

"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) 
} 
相关问题