2012-05-07 16 views

Respuesta

62

El hecho de que this dentro de una función llamada en el contexto global no hará referencia al objeto global se puede utilizar para detectar el modo estricto:

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

Demostración:

> 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

Grande. Esto es elegante y funciona en todas partes. –

+0

Para aclaración, la declaración de devolución es equivalente a 'return this === undefined', no lo está comparando con el objeto global, solo está comprobando si' this' existe. – aljgom

7

Sí, es this'undefined' dentro de un método global cuando se está en modo estricto.

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

Parece que ya obtuvo una respuesta. Pero ya escribí un código. Así que aquí

+1

Esto es mejor que la respuesta de Mehdi ya que funcionará en todas partes, no solo en un ámbito global. Upped :) – mgol

+7

Esto produce un error de sintaxis, que ocurre antes de que se ejecute el código, por lo que no se puede capturar ... – skerit

+3

Esto no funcionará en ES6 ya que la verificación se elimina para permitir los nombres de las propiedades calculadas. –

16

prefiero algo que no utiliza excepciones y trabaja en cualquier contexto, no sólo uno mundial:

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

Se utiliza el hecho de la eval en modo estricto no introduce una nueva variable en el contexto externo.

+0

Solo por curiosidad, ¿qué tan a prueba de balas es esto en 2015, ahora que ES6 está aquí? –

+2

Verifico que funciona en ES6 en los últimos chrome y nodejs. –

+1

Elegante y funcional, ¡gracias! – rudyryk

1

forma más elegante: si "esto" es objeto, convertirlo en cierto

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