2012-05-07 9 views

risposta

62

Il fatto che this dentro una funzione chiamata nel contesto globale non punterà all'oggetto globale può essere utilizzato per rilevare modalità rigorosa:

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

Dimostrazione:

> 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. Questo è elegante e funziona ovunque. –

+0

Per chiarimenti, l'istruzione return equivale a "return this === undefined", non lo confronta con l'oggetto globale, sta solo controllando se "this" esiste. – aljgom

7

Sì, this è 'undefined' all'interno di un metodo globale quando si è in modalità rigorosa.

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

Sembra che tu abbia già una risposta. Ma ho già scritto del codice. Così qui

+1

Questo è migliore della risposta di Mehdi poiché funzionerà ovunque, non solo in un ambito globale. Alzato. :) – mgol

+7

Ciò si traduce in un errore di sintassi, che si verifica prima dell'esecuzione del codice, quindi non può essere rilevato ... – skerit

+3

Questo non funzionerà in ES6 o come il controllo viene rimosso per consentire i nomi delle proprietà calcolate. –

16

preferisco qualcosa che non fa uso di eccezioni e funziona in qualsiasi contesto, non solo globale uno:

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

usa il fatto che il in modalità rigorosa eval non introduce una nuova variabile in il contesto esterno.

+0

Solo per curiosità, quanto è a prova di proiettile questo nel 2015, ora che ES6 è qui? –

+2

Verifico che funzioni in ES6 sugli ultimi chrome e nodejs. –

+1

Elegante e funzionante, grazie! – rudyryk

1

modo più elegante: se "questo" è oggetto, convertirlo in vero

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