¿Cómo es el modo estricto ("use strict";) henetworkingado por las funciones?

Aquí está mi código que parece indicar que la respuesta es sí – http://jsfiddle.net/4nKqu/

var Foo = function() { 'use strict' return { foo: function() { a = 10 alert('a = ' + a) } } }() try { Foo.foo() } catch (e) { alert(e) } 

¿Podrían citar los enunciados de la norma que aclaran que 'use strict' se aplica automáticamente a todos los cierres y funciones definidos dentro de una function a la que hemos aplicado 'use strict' ?

La parte relevante de la especificación:

http://www.ecma-international.org/ecma-262/5.1/#sec-10.1.1

que dice:

 Code is interpreted as strict mode code in the following situations: 
  • El código global es un código global estricto si comienza con un Prólogo de directiva que contiene una directiva de uso estricto (ver 14.1).

  • El código de evaluación es un código de evaluación estricto si comienza con un Prólogo de directiva que contiene una directiva de uso estricto o si la llamada a eval es una llamada directa (ver 15.1.2.1.1) a la function de evaluación que está contenida en el código de modo estricto.

  • El código de function que es parte de FunctionDeclaration, FunctionExpression o accessor PropertyAssignment es un código de function estricta si su FunctionDeclaration, FunctionExpression o PropertyAssignment está contenida en el código de modo estricto o si el código de function comienza con un Prologue directivo que contiene una directiva de uso estricto.

  • El código de function que se proporciona como el último argumento para el constructor de function incorporado es un código de function estricta si el último argumento es una cadena que cuando se procesa como un cuerpo de function comienza con un prólogo de directiva que contiene una directiva de uso estricto.

Entonces, para las funciones definidas explícitamente dentro de un 'scope estricto', henetworkingarán el modo estricto:

 function doSomethingStrict(){ "use strict"; // in strict mode function innerStrict() { // also in strict mode } } 

Pero las funciones creadas con el constructor de Function no henetworkingan el modo estricto de su context, por lo que deben tener un "use strict"; explícito "use strict"; statement si los quiere en modo estricto. Por ejemplo, señalando que eval es una palabra key reservada en modo estricto (pero no fuera del modo estricto):

 "use strict"; var doSomething = new Function("var eval = 'hello'; console.log(eval);"); doSomething(); // this is ok since doSomething doesn't inherit strict mode 

La respuesta es sí, pero probablemente no encontrará la oración exacta en la documentation, sino que habla de contexts. Cuando define una function Foo dentro de otra Bar funciones, Foo se crea en el context de Bar . Si el context de Bar está en modo estricto, eso significa que el context de Foo está en modo estricto.

Puede consultar la documentation aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode

Si lo piensas, no tener ese comportamiento sería realmente poco práctico (y no hay un inconveniente real).

Esto también es útil para hacer que toda la biblioteca use el modo estricto sin ningún problema en caso de concatenación de varios scripts:

También puede tomar el enfoque de envolver todo el contenido de un script en una function y hacer que esa function externa use el modo estricto.