Strict Mode II

Categories:

En la primer parte del modo estricto – strict mode – de ECMAScript 5 mencioné las restricciones que consideré más probables que existan en el código que tengamos escrito.

Ahora voy a mencionar a otras restricciones que existen al utilizar el modo estricto.

arguments

No había escrito nada de arguments. Dejo una referencia de se uso en modo normal.

No se puede utilizar como identificador – nombre de variable, función, objeto – .

"use strict";

var arguments; 
arguments = {"nombre": "usuario", "correo": "[email protected]"}

function arguments() {
 console.log("Nombre de función no válido en modo estricto");
}

Al utilizar arguments y asignar a cualquier elemento no va a modificar el valor que se encuentra almacenado en el parámetro.

function actualizar(mensaje) {
  "use strict";
  console.log(arguments[0]);
  arguments[0] = "Parámetro con el nombre mensaje actualizado";
  console.log(mensaje);
  console.log(arguments[0]);
}
  
actualizar("¡Hola Mundo!");

No se puede utilizar arguments.callee –
Si se quiere utilizar la función se tiene que invocar con su nombre.

var i = 0;

function actualizar(iteracion, mensaje) {
   "use strict";
    iteracion++;
    mensaje += " " + iteracion; 
    console.log(mensaje);
    if (iteracion < 3) {
       arguments.callee(iteracion, mensaje);
// Si queremos utilizar la función tenemos que
// utilizar su nombre
//        actualizar(iteracion, mensaje);
    }    
}

actualizar(i, "Iteración");

Objetos

Aunque escribí un poco de programación orientada a objetos en JavaScript, ECMAScript 5 nos permite tener aún más control sobre los objetos – referencia.

No se puede asignar un valor a una propiedad que es solo de lectura.

"use strict";
var app = Object.create({}, {
  version: {
    value: "0.1.0",
    writable: false
  },
  nombre: {
    value: "Mi super aplicación",
    writable: false
  }
});
 
app.version = "0.1.1";  
app.nombre = 'Mi aplicación corregida';

No se pueden agregar propiedades a un objeto que prevenga extensiones.

"use strict";
  
var app = Object.create({}, {
  version: {
    value: "0.1.0",
    writable: true
  },
  nombre: {
    value: "Mi super aplicación",
    writable: true
  }
});
  
Object.preventExtensions(app);

app.nombre = "Mi aplicación";

/*
Aunque en este caso es posible
modificar el nombre y la versión
del objeto app, no es posible
agregar otra propiedad. 

*/

app.descripcion = "Esta es mi primer aplicación.";

No se puede borrar una propiedad de un objeto cuyo valor configurable sea false.
Tampoco se pueden borrar variables, funciones.

"use strict";
  
var app = Object.create({}, {
  version: {
    value: "0.1.0",
    configurable: false
  },
  nombre: {
    value: "Mi super aplicación",
    configurable: false
  }
});
  
delete app.version

/*
En modo estricto tampoco podemos 
borrar variables
*/

var mi_variable = "Mi aplicación";
delete mi_variable;

/*
En modo estricto tampoco podemos 
borrar funciones
*/
function mi_funcion() {
  console.log("Mi función");
}

delete mi_funcion;

Otros

Otras consideraciones que van a mandar error en el modo estricto.
Lo dejé aquí porque – considero que – son aún menos utilizadas.

eval

No se puede utilizar eval como identificador – nombre de variable, función.

"use strict";
  
var eval; 
eval = 19; 
console.log(eval);

Las variables que se incluyan dentro de lo que está evaluando eval, no son accesibles fuera de eval.

"use strict";

var codigo = "var nombre = 'Nombre para una variable dentro de una cadena de texto'; console.log(nombre);";
eval(codigo);

console.log(nombre);

with

No se puede utilizar esta declaración en modo estricto.

"use strict";

var objeto = {
  nombre: "Mi objeto", 
  version: "0.1.0",
  pares: [2,4,6,8,10]
}



with (objeto) {
  nombre = "Nombre del objeto";
  version = "0.1.1";
  
  for (var i = 0; i < pares.length; i++) {
    pares[i] = pares[i] - 1;
  }    
  
}

console.log(objeto.nombre);
console.log(objeto.version);
console.log(objeto.pares);