La parte rilevante della specifica:
http://www.ecma-international.org/ecma-262/5.1/#sec-10.1.1
che dice:
Code is interpreted as strict mode code in the following situations:
Global code è un codice globale severo se si inizia con una direttiva Prologo che contiene una direttiva sull'uso rigoroso (cfr. 14.1).
codice
Eval è severo codice eval se si inizia con una direttiva Prologo che contiene una direttiva rigorosa Usare o se la chiamata a eval è una chiamata diretta (vedi 15.1.2.1.1) per la funzione eval che è contenuto nel codice di modalità rigoroso.
- codice
funzione che fa parte di un FunctionDeclaration, FunctionExpression, o accessor PropertyAssignment è severo codice funzione se FunctionDeclaration, FunctionExpression o PropertyAssignment è contenuto nel rigoroso codice di modalità o se il codice della funzione inizia con una direttiva Prologo che contiene una direttiva di utilizzo rigoroso .
- codice
funzione che viene fornito come ultimo argomento al costruttore funzione built-in è rigorosa codice funzione se l'ultimo argomento è una stringa che, quando trattati come FunctionBody inizia con una direttiva Prologo che contiene un Usa Strict Direttiva.
Così, per funzioni definite esplicitamente all'interno di un 'stretto ambito', perché erediteranno modalità rigorosa:
function doSomethingStrict(){
"use strict";
// in strict mode
function innerStrict() {
// also in strict mode
}
}
Ma funzioni create utilizzando il costruttore Function
non ereditano modalità rigorosa da il loro contesto, quindi deve avere un'esplicita dichiarazione "use strict";
se li vuoi in modalità rigorosa. Ad esempio, notando che eval
è una parola chiave riservata in modalità rigorosa (ma non al di fuori della modalità rigorosa):
"use strict";
var doSomething = new Function("var eval = 'hello'; console.log(eval);");
doSomething(); // this is ok since doSomething doesn't inherit strict mode
Si potrebbe voler considerare esplicitamente dichiarare la modalità rigorosa in ogni funzione in ogni caso, altrimenti lascia spazio per errori quando il codice viene refactored. –