2013-10-02 15 views
7

Ecco il mio codice che sembra indicare che la risposta è sì - http://jsfiddle.net/4nKqu/In che modo la modalità strict ("use strict";) è ereditata dalle funzioni?

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

try { 
    Foo.foo() 
} catch (e) { 
    alert(e) 
} 

La prego di citare le dichiarazioni del standard che chiarisce che 'use strict' viene applicato automaticamente a tutte le chiusure e le funzioni definite all'interno di una funzione di che abbiamo applicato 'use strict'?

+0

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. –

risposta

8

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 
2

La risposta è sì, ma probabilmente non troverà la frase esatta nella documentazione, invece parla di contesti. Quando si definisce una funzione Foo all'interno di un'altra funzione Bar, Foo viene creata nel contesto di Bar. Se il contesto di Bar è in modalità rigorosa, significa che il contesto di è in modalità rigorosa.

Potete guardare la documentazione qui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode

Se ci pensate, non avendo che il comportamento sarebbe davvero poco pratico (e non c'è vero problema di esso).

Questo è anche utile per rendere la vostra intera libreria utilizzare la modalità rigorosa senza alcun problema in caso di concatenazione di diversi script:

Si può anche prendere l'approccio di avvolgere l'intero contenuto di uno script in un funzione e avendo quella funzione esterna utilizzare la modalità rigorosa.

Problemi correlati