Modalità Strict Is Coming To Town
14 dic 2010 alle 14:12 da Douglas Crockford | In Sviluppo | 20 commentiQuesto è il tempo e la stagione in cui persone di tutto il mondo dimenticare le loro differenze e si incontrano in pace e comunione per celebrare il primo anniversario della approvazione da parte della Assemblea Generale ECMA del linguaggio di programmazione standard ECMAScript, quinta edizione. La caratteristica più importante di ES5 è la nuova modalità Strict. Modalità Strict è un opt-in modo che le riparazioni o rimuove alcune delle caratteristiche più problematiche del linguaggio.
Specificando la modalità Strict
Ci sono due modi per richiedere modalità rigorosa. Il primo è quello di inserire il pragma
"Use strict"; nella parte superiore di una unità di file o di compilazione. Si deve apparire prima di ogni altra istruzione, ma può essere preceduto da spazi bianchi e commenti. Ha la forma di una dichiarazione stringa letterale inutile, quindi sarà ignorato da ES3 sistemi. Ciò significa che è possibile scrivere ES5/strict programmi che possono funzionare anche con i browser più vecchi. Rigido codice può anche interagire con i rigorosi (o sciatta) del codice, in modo rigoroso le funzioni possono chiamare funzioni sciatta, sciatta e funzioni possono chiamare funzioni rigorosa. Questo elevato livello di compatibilità rende l'adozione della modalità rigorosa facile.
Tutto il codice nel file o unità compilation con i "use strict"; preambolo saranno trattati come codice rigoroso. C'è un problema, però. Considerazioni sulle prestazioni attualmente ci costringono a concatenare i file JavaScript molti insieme per evitare il cumulo ritardi HTTP. Se un file con un "use strict"; preambolo è il codice sciatta accodate ad esso, il codice sciatto saranno trattati come severi e probabilmente fallirà. C'è una regola semplice: Non mescolare rigoroso e scrupoloso nello stesso file, ma abbiamo già visto alcuni siti web famosi ottenere questo torto.
Il secondo modo è quello di inserire il pragma è come prima istruzione di una funzione. Che dichiara che la funzione intera sarà rigorosa, comprese le eventuali funzioni che sono annidati al suo interno. Rigore funzione rispetta portata, codice in modo rigoroso e scrupoloso del codice possono essere mescolati nello stesso file. Questa seconda forma funziona molto bene con il modello del modulo e delle sue molte varianti. La seconda forma è preferibile perché evita il pericolo concatenazione.
(Function () { "Use strict"; / / Questa funzione è stretto ... }()); (Function () { / / Ma questa funzione è sciatta ... }());
Portata
Storicamente, JavaScript è stato confuso su come le funzioni sono limitate. A volte sembrano essere staticamente ambito, ma alcune caratteristiche li rendono si comportano come se fossero dinamico ambito. Si tratta di confusione, rendendo i programmi difficili da leggere e capire. Incomprensione cause bug. E 'un problema anche per le prestazioni. Static scoping permetterebbe variabile vincolante per accadere in fase di compilazione, ma l'esigenza di scope dinamico significa che l'associazione deve essere rinviata al runtime, che viene fornito con una penalizzazione delle prestazioni significative.
Modalità rigorosa richiede che tutte le variabili vincolanti da fare staticamente. Ciò significa che le caratteristiche che in precedenza richiedevano binding dinamico deve essere eliminato o modificato. In particolare, la dichiarazione con viene eliminato, e la eval capacità funzione di alterare l'ambiente del suo chiamante è fortemente limitata.
Uno dei vantaggi del rigido codice è che strumenti come YUI Compressor può fare un lavoro migliore quando l'elaborazione.
Implicita delle variabili globali
JavaScript è implicita delle variabili globali. Se non esplicitamente dichiarare una variabile, una variabile globale è implicitamente dichiarato per voi. Questo rende la programmazione più facile per i principianti perché possono trascurare alcune delle loro attività di manutenzione di base. Ma rende la gestione dei grandi programmi molto più difficile e si degrada in modo significativo l'affidabilità. Quindi, in modalità rigorosa, implicita variabili globali non vengono più creati. Si dovrebbe dichiarare esplicitamente tutte le variabili.
Perdita globale
Ci sono una serie di situazioni che potrebbero causare this di essere vincolato all'oggetto globale. Per esempio, se si dimentica di fornire il new prefisso quando si chiama una funzione di costruzione, il costruttore di this sarà vincolato inaspettatamente all'oggetto globale, quindi invece di inizializzazione di un oggetto nuovo, sarà invece silenziosamente manomissione variabili globali. In queste situazioni, modalità rigorosa sarà invece legare this alla undefined , che farà sì che il costruttore per generare un'eccezione, invece, permettendo l'errore di essere rilevato molto prima.
Il mancato rumorosi
JavaScript ha sempre avuto proprietà di sola lettura, ma non si poteva crearle voi stessi fino a ES5 è Object.createProperty funzione esposta questa possibilità. Se si è tentato di assegnare un valore a una proprietà di sola lettura, non riuscirebbe in silenzio. L'assegnazione non cambierebbe il valore della proprietà, ma il programma dovrebbe procedere come se avesse. Questo è un pericolo che può causare l'integrità dei programmi di andare in uno stato incoerente. In modalità rigorosa, il tentativo di modificare una proprietà di sola lettura genera un'eccezione.
Ottale
Il (o base 8) rappresentazione ottale dei numeri è stata estremamente utile quando si fa della macchina a livello di programmazione su macchine la cui parola dimensioni sono un multiplo di 3. Avevi bisogno ottale quando si lavora con il mainframe CDC 6600, che aveva una dimensione di parola di 60 bit. Se si potesse leggere ottale, si poteva guardare una parola come 20 cifre. Due cifre rappresentate il codice op, e una una cifra identificato di 8 registri. Durante il lento passaggio dai codici macchina per linguaggi di alto livello, è stato pensato per essere utile prevedere forme ottale nei linguaggi di programmazione.
In C, una rappresentazione estremamente sfortunato octalness è stato selezionato: zero iniziale. Quindi, in C, 0100 significa 64, non 100, e 08 è un errore, non 8. Ancora più sfortunatamente, questo anacronismo è stato copiato in quasi tutte le lingue moderne, tra cui JavaScript, dove viene utilizzato solo per creare gli errori. Non ha altro scopo. Quindi, in modalità rigorosa, forme ottale non sono più ammessi.
Et cetera
Le arguments serie pseudo diventa un po 'più serie, come in ES5. In modalità rigorosa, perde la sua callee e caller proprietà. In questo modo è possibile passare i vostri arguments di codice non attendibile senza rinunciare a un sacco di contesto confidenziale. Inoltre, la arguments proprietà delle funzioni è eliminato.
In modalità rigorosa, duplicare chiavi in un valore letterale di funzione produrrà un errore di sintassi. Una funzione non può avere due parametri con lo stesso nome. Una funzione non può avere una variabile con lo stesso nome di uno dei suoi parametri. Una funzione non può delete sue variabili. Un tentativo di delete un non configurabile proprietà genera ormai un'eccezione. Valori primitivi non sono implicitamente avvolti.
Se il programma passa JSLint , probabilmente funzionerà in modalità rigorosa.
E 'ancora un mondo imperfetto
Ci sono ancora problemi in JavaScript che strict mode non affronta. Per esempio, l'inserimento e virgola è ancora un pericolo, e 0.1 + 0.2 è ancora uguale a 0,3. Correzione di questi problemi dovrà aspettare per le edizioni future.
Importanza Strict Mode
In aggiunta ai benefici evidenti per l'affidabilità e la leggibilità del programma, la modalità rigorosa sta aiutando a risolvere il problema Mashup. Vogliamo essere in grado di invitare il codice di terze parti sulle nostre pagine per fare cose utili per noi e per i nostri utenti, senza che il codice della licenza a prendere il browser o di travisare se stesso per l'utente o sui nostri server. Abbiamo bisogno di vincolare il codice di terze parti. Sistemi come Caja Google farlo, ma a un costo significativo in termini di prestazioni e disagi. La mia AdSafe sistema fa anche questo, ma a costo di eliminare this e [] indicizzazione dal linguaggio, che può rendere difficile l'adozione. Modalità rigorosa ci permette di rendere il codice di terze parti con la convenienza e le prestazioni del AdSafe e l'espressività di Caja. Questo sarà di fondamentale importanza come i nostri siti diventano più complessi e più connessi.
Strict mode non risolve il problema XSS. La soluzione a questo problema dipende dal W3C prendere qualche azione positiva .
ES5/strict è ora in anteprime, e presto sarà di serie in tutti i browser compatibili con gli standard in tutto il mondo.
Condividere ed estendere: Bookmark with del.icio.us | Digg it! | reddit!
20 commenti »
RSS feed dei commenti a questo articolo.
Lascia un commento

Copyright © 2006-2011 Yahoo! Inc. Tutti i diritti riservati. Privacy Policy - Termini del Servizio
Powered by WordPress su Yahoo! Web Hosting .


come al solito messaggio awesome! ES5 è il futuro .. Object.create (), Object.defineProperty (), Object.isExtensible (), Array.isArray (), il supporto nativo per JSON sono grandi caratteristiche .. check-out AdSafe, sembra essere molto promettente
Commento di Sebastiano Armeli - 14 dic 2010 #
Se arguments.callee è fuori, c'è un altro modo di fare riferimento a una lambda dal suo corpo?
Commento di Arieh - 15 DICEMBRE 2010 #
Ci sono i browser (beta o non) che sono compatibili con modalità completamente rigorosa?
Commento di Nate - 15 Dic 2010 #
@ Arieh, sì -
var carl = function bob(a) {
if (!a) { bob(1); } // reference scoped to inside this function
alert(carl === bob); // gotcha - true in all browsers but false in ie...
};
Commento di Chris - 15 DICEMBRE 2010 #
Arieh: È possibile denominare espressioni di funzione e fare riferimento ad esse con quel nome. ad esempio
var x = function lookMaNoYCombinator(a, b) { if (a === 0) return a + b; else return lookMaNoYCombinator(a - 1, b) }Commento di Sami Samhuri - 15 Dicembre, 2010 #
@ Arieh: si deve usare un lambda di nome se volete ricorsione. ad es. (La funzione f () {f ()}). Questo ha anche il vantaggio di non attacchi Argomenti oggetto di | questa |
Commento di Oliver - 15 Dic 2010 #
@ Nate: nightly build di WebKit e Firefox dovrebbe essere compatibile con entrambe le modalità rigorosa, e noi tutti apprezziamo i bug essere presentata se si trova qualsiasi (a http://bugs.webkit.org e http://bugs.mozilla.org)
Commento di Oliver - 15 Dic 2010 #
Un grafico che mostra grande ES5 compatibilità in vari browser può essere trovato qui: http://kangax.github.com/es5-compat-table/
Commento di Jimmy - 15 DICEMBRE 2010 #
'Con' e iniettando eval non ha veramente implementare binding dinamico . Anche ES3 piena usa legame lessicale (anche se non necessariamente vincolante statica) in tutti i casi. Queste caratteristiche erano certamente confondere, però.
Commento di David-Sarah Hopwood - 16 dic 2010 #
Ciao Douglas,
Buona visione, grazie. Inoltre, sono sicuro che i vostri lettori saranno interessati nella descrizione dettagliata modalità rigorosa: http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/
PS: un paio di aggiunte / correzioni:
E 'bene avere una dichiarazione di variabile con lo stesso nome di uno degli argomenti. Tecnicamente, la dichiarazione sarà solo saltato, visto che è già dichiarato tramite il legame argomento.
E 'stato sempre così - le variabili (ad eccezione di quelli creati utilizzando
evalcontesto) hanno sempre DontDelete {} in ES3 / [[configurabile]] = false in ES5. Vale a dire che non è possibile eliminare una variabile indipendentemente dalle modalità rigorosa.Dmitry.
Commento di Dmitry A. Soshnikov - 17 Dicembre 2010 #
Will YUI3 aggiungere "use strict" per i suoi moduli?
Commento di David - 17 DICEMBRE 2010 #
Ciao Douglas,
Sono confuso sulla sottostante dichiarazione dal tuo post.
"Modalità Strict richiede che tutte le variabili vincolanti da fare staticamente. Ciò significa che le caratteristiche che in precedenza richiedevano binding dinamico deve essere eliminato o modificato "
parola chiave "this" - Ha dinamica vincolante o lessicale (statico) vincolante?
Se si tratta di avere binding dinamico, intendi dire che dovremmo smettere di usare 'questo' in modalità rigorosa?
Sono molto confuso. Ho cominciato a imparare JavaScript da ultimo un mese dalla tua presentazioni video. Sono molto molto utile. Questo è il mio primo linguaggio di programmazione. Può essere il mio dubbio è molto strano qui.
Ma vogliono solo sapere da voi il dubbio 'questo'.
Grazie
Commento di ekanna - 28 dicembre 2010 #
In modalità rigorosa, il modulo di questo metodo si lega all'oggetto come prima. La funzione associa questa forma di indefinito, non l'oggetto globale.
Commento di Douglas Crockford - 29 Dic 2010 #
Dmitrij, hai appena descritto il caso in cui è possibile effettuare le variabili che si possono eliminare! La sintassi del l'operatore delete permette di variabili proprio per questo caso. Ma non di più.
-Sarah e David, i peli si divide sono abbastanza brevi.
Commento di Douglas Crockford - 29 Dic 2010 #
Grazie Douglas.
Commento di ekanna - 7 gennaio 2011 #
Può essere utile per correggere errore di battitura in "Noisy Failure"-sezione "CreateProperty" dovrebbe essere "DefineProperty".
Commento di Travis - 11 gennaio 2011 #
"Strettamente impressionante"
Commento di franz enzenhofer - gen 13, 2011 #
Crockford rockz!
Commento di Marc Draco - 20 GENNAIO 2011 #
Così, quando si YUI Compressor fermare la caduta "use strict" pragma dal codice durante minifaction? :)
Commento di marcoos - 3 febbraio 2011 #
s / minifaction / minimizzazione /
Commento di marcoos - 3 febbraio 2011 #