Esiste comunque la possibilità di verificare se la modalità rigorosa 'use strict' è applicata e si desidera eseguire codice diverso per la modalità strict e l'altro codice per la modalità non strict. ricerca di funzione come isStrictMode();//boolean
Esiste un modo per verificare se viene applicata la modalità rigorosa?
risposta
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
Sì, this
è 'undefined'
all'interno di un metodo globale quando si è in modalità rigorosa.
function isStrictMode() {
return (typeof this == 'undefined');
}
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
Questo è migliore della risposta di Mehdi poiché funzionerà ovunque, non solo in un ambito globale. Alzato. :) – mgol
Ciò si traduce in un errore di sintassi, che si verifica prima dell'esecuzione del codice, quindi non può essere rilevato ... – skerit
Questo non funzionerà in ES6 o come il controllo viene rimosso per consentire i nomi delle proprietà calcolate. –
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.
Solo per curiosità, quanto è a prova di proiettile questo nel 2015, ora che ES6 è qui? –
Verifico che funzioni in ES6 sugli ultimi chrome e nodejs. –
Elegante e funzionante, grazie! – rudyryk
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)
}
Grande. Questo è elegante e funziona ovunque. –
Per chiarimenti, l'istruzione return equivale a "return this === undefined", non lo confronta con l'oggetto globale, sta solo controllando se "this" esiste. – aljgom