No se pueden crear propiedades de objeto en modo estricto

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);

preguntado el 12 de junio de 12 a las 16:06

1 Respuestas

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 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 de this depende de cómo se llame a una función. - James Allardice

También vale la pena leerlo: nczonline.net/blog/2012/03/13/… Busque el encabezado: "Elimina esta coerción". - anddoutoi

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.