di: Rajasekharan Vengalil 22 Novembre 2011
Ma quali sono esattamente le restrizioni e la semantica che si applicano in modalità strict? Rivediamo le principali restrizioni:
Solo per questo aspetto dovrebbe valere la pena di utilizzare la modalità Strict. Le variabili non dichiarate non vengono aggiunte automaticamente come proprietà globali dell'oggetto.
"use strict"; // ReferenceError: Variable undefined in Strict Mode foo = 10;
Proprio per di questa restrizione, il frammento di codice che avevamo esaminato nel paragrafo "Cos'è la modalità Strict?" non gira e solleva un "ReferenceError", a causa del refuso sul nome della variabile "product" nell'assegnamento dentro il ciclo "for".
function findProduct(numbers) {
"use strict";
var product = 0,
len = numbers.length;
for(var i = 0; i < len; ++i) {
// ReferenceError: Variable undefined in Strict Mode
prodct = product * numbers[i];
}
return product;
}
print(findProduct([1, 2, 3, 4, 5]));
Nelle funzioni chiamate senza impostare un contesto esplicito la parola chiave "this" non viene associata automaticamente al "global object". Si consideri il seguente frammento di codice:
function foo() {
// prints “true”
print(this === window);
}
foo();
Qui "foo" è invocato senza impostare un esplicito contesto per l'oggetto, cioè non abbiamo una chiamata del tipo:
foo.call({foo: "bar"});
Nella modalità unrestricted questo fa sì che il contesto venga automaticamente inizializzato con l'oggetto "globale", che nei browser è rappresentato dall'oggetto "window". Poiché il frammento di codice è stato eseguito in modalità unrestricted, l'espressione "this === window" restituisce true. Se modifichiamo la funzione in questo modo, però, vediamo che "this" non è più uguale a "window":
function foo() {
"use strict";
// prints “false”
print(this === window);
}
foo();
Nomi di variabili e funzioni come eval, arguments, implements, let, private, public, yield, interface, package, protected, e static generano errori.
"use strict"; var yield; // SyntaxError: Expected identifier
Violazioni della configurazione, specificata nelle proprietà del descrittore per ES5, generano errori se lanciate in modalità Strict, invece di essere silenziosamente ignorate. Ecco alcuni esempi:
"use strict";
var person = Object.create({}, {
name: {
value: "foo",
writable: false,
configurable: true,
enumerable: true
}
});
// TypeError: Assignment to read only properties not allowed in
// Strict Mode
person.name = "bar";
Nella riga writable: false, impostare il descrittore "writable" a "false" fa diventare la proprietà "name" dell'oggetto "person" di tipo read-only. I tentativi di assegnamento su questa proprietà sarebbero silenziosamente ignorati nella modalità unrestricted, ma causeranno un "TypeError" in Strict Mode.
"use strict";
var person = Object.create({}, {
name: {
value: "foo",
writable: false,
configurable: false,
enumerable: true
}
});
// TypeError: Cannot redefine non-configurable property 'name'
Object.defineProperty(person, "name", {
value: "bar",
writable: true,
configurable: true,
enumerable: true
});
Qui abbiamo cercato di modificare il descrittore di proprietà di un oggetto non configurabile. Ancora una volta, un errore che sarebbe passato inosservato nella modalità unrestricted genera un "TypeError" nella modalità strict.
La scrittura di una proprietà che non ha un metoto "setter" definito genera un errore nello Strict Mode che nella modalità unrestricted sarebbe stato ignorato silenziosamente:
"use strict";
var person = Object.create({}, {
name: {
get: function() {
return "foo";
},
configurable: false,
enumerable: true
}
});
// TypeError
person.name = "bar";
Qui, "name" è una proprietà che non ha un metodo "setter" definito. I tentativi di assegnare un valore a questa proprietà causa un errore nella modalità Strict pur essendo tranquillamente ignorato in quella unrestricted.
Estendere un oggetto non-extensible genera un errore nello Strict Mode che altrimenti verrebbe semplicemente ignorato:
"use strict";
var person = {
name: "foo"
};
Object.preventExtensions(person);
// TypeError: Cannot create property for a non-extensible object
person.age = 10;
Ci sono altre piccole restrizioni per la modalità Strict che vengono utilizzate meno frequentemente:
"use strict";
var o = Object.create({}, {
name: {
value: "foo"
},
name: {
value: "bar"
}
});
Questo codice genera un "SyntaxError" con il messaggio "Multiple definitions of a property not allowed in Strict Mode" ("definizioni multiple di una proprietà non ammesse in modalità strict"). Nella modalità unrestrict, "o.name" avrebbe il valore "bar".
Guida Node.jsIl framework che permette di per usare V8, l'interprete JavaScript... |
Canvas, guida ai frameworkCanvas, tra gli elementi di HTML5 è forse quello di maggior impatto.... |
Guida jQuery UICreare siti ricchi e dinamici con jQuery UI, il progetto ufficiale... |
Ogni martedì, direttamente nella tua e-mail: guide, articoli, script, novità e approfondimenti tecnici su JavaScript.
Iscriviti alla newsletter
|
|
Corso Webmaster base18 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base25 Giugno 2012 a Milano |
|
|
Corso JQuery e Ajax per Webmaster03 Luglio 2012 a Milano |
|
|
Corso Google AdWords Base05 Giugno 2012 a Roma |
|
|
Corso Webmaster base11 Giugno 2012 a Roma |