2012-05-07 11 views

Antwort

62

Die Tatsache, dass this in einer Funktion im globalen Kontext genannt wird nicht auf das globale Objekt Punkt verwendet werden Strict-Modus zu erkennen:

var isStrict = (function() { return !this; })(); 

Demo:

> 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

Großen. Das ist elegant und funktioniert überall. –

+0

Zur Verdeutlichung ist die return-Anweisung äquivalent zu 'return this === undefined', es wird nicht mit dem globalen Objekt verglichen, es wird nur überprüft, ob' this' existiert. – aljgom

7

Yep, this ist 'undefined' innerhalb einer globalen Methode, wenn Sie im strikten Modus sind.

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

Sieht aus, als hättest du schon eine Antwort bekommen. Aber ich habe schon etwas Code geschrieben. Also hier

+1

Das ist besser als Mehdis Antwort, denn sie wird überall funktionieren, nicht nur im globalen Rahmen. Ups. :) – mgol

+7

Dies führt zu einem Syntaxfehler, der auftritt, bevor der Code ausgeführt wird, damit er nicht abgefangen werden kann ... – skerit

+3

Dies funktioniert nicht in ES6, da die Überprüfung entfernt wird, um berechnete Eigenschaftsnamen zuzulassen. –

16

Ich ziehe es etwas, das keine Ausnahme nicht verwendet und arbeitet in jedem Kontext, nicht nur global:

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

Es nutzt die Tatsache, die im strikten Modus eval nicht eine neue Variable einführt in der äußere Kontext.

+0

Nur aus Neugier, wie kugelsicher ist das 2015, jetzt da ES6 da ist? –

+2

Ich verifiziere, dass es in ES6 auf neuesten Chrome und Nodejs funktioniert. –

+1

Elegant und funktionierend, danke! – rudyryk

1

eleganteren Weg: wenn "das" Objekt ist, wandelt es in wahre

"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) 
}