No se pueden crear propiedades de objeto en modo estricto
Frecuentes
Visto 2,225 equipos
2
Si uso el modo estricto, el siguiente código no funciona. Falla en this.bar = 'foobar'; línea. ¿Por qué esto es tan? ¿Cómo puedo hacer una propiedad de objeto en modo estricto?
<html>
<body>
<script>
"use strict";
var foo = (function () {
this.bar = 'foobar';
return this;
}());
alert(foo.bar);
</script>
</body>
</html>
editar: Gracias a James Allardice por señalar el problema. Estaba pensando erróneamente que la función autoejecutable estaba creando un objeto, pero no es así. Necesitaba hacer uno de los siguientes en su lugar:
"use strict";
var foo = new function () {
this.bar = 'foobar';
};
alert(foo.bar);
o (este le gusta más a JSLint)
"use strict";
var foo = (function () {
var obj = {};
obj.bar = 'foobar';
return obj;
}());
alert(foo.bar);
1 Respuestas
3
En modo estricto, this
no se referirá a la ventana. En su ejemplo, eliminar la directiva de modo estricto causará this
para referirse a la ventana.
Ya que en modo estricto, this
en tu ejemplo es undefined
, obtienes un error. Eso es porque no puedes establecer propiedades en algo que es undefined
.
Desde DND (énfasis en las partes relevantes a su situación):
Primero, el valor pasado como este a una función en modo estricto no está encuadrado en un objeto. Para función normal, siempre es un objeto: el objeto proporcionado si se llama con un valor de objeto this; el valor, encuadrado, si se llama con un booleano, cadena o número this; o el objeto global si se llama con un valor indefinido o nulo esto... El encuadre automático es un costo de rendimiento, pero exponer el objeto global en los navegadores es un peligro para la seguridad, porque el objeto global proporciona acceso a la funcionalidad "segura" que los entornos de JavaScript deben restringir. Así, para una función de modo estricto, el especificado esto se usa sin cambios
Respondido el 12 de junio de 12 a las 16:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas javascript mode strict or haz tu propia pregunta.
¿No debería esto referirse a la función anónima? - jack alan
No. Si ejecuta eso fuera del modo estricto
this
se referirá a la ventana. El valor dethis
depende de cómo se llame a una función. - James AllardiceTambién vale la pena leerlo: nczonline.net/blog/2012/03/13/… Busque el encabezado: "Elimina esta coerción". - anddoutoi