Javascript, l’objet window et le strict mode

Javascript, l'objet window et le strict mode

Avec un titre comme celui-là, je vais vous raconter une histoire, celle, encore une fois, de mon ignorance, qui ne fait que croître, et ça c’est bien. Hein ?

Le strict mode

Depuis que j’utilise le générateur yo angular, j’ai pris l’habitude d’activer le strict mode quand le code est destiné à être affiché sur un navigateur moderne, ou à être exécuté par Node.js.

Et un jour, en développant une extension en Node.js, je suis tombé sur un problème : en instanciant une classe, je n’avais pas accès à this

'use strict';

function hello(options) {
	this.options = options || {}; // TypeError: this is undefined
	console.log(this);

	return function() {
		console.log('hello world!');
	};
}

var h = hello();

Et pourtant en enlevant le strict mode, tout rentrait dans l’ordre.

Subtilité, ou pas, de this

En fait, il s’agissait d’une erreur d’inattention : j’avais oublié le mot clef new. Tout simplement.

var h = new hello();

Mais alors que se passait-il ?

Sans le strict mode, this correspond à l’objet window. Ainsi, utiliser this dans une fonction en fait profiter toute l’application.

Le strict mode supprime le raccourci où this équivaut à window et renvoie une erreur indiquant que this n’existe pas.

Pour que this soit disponible, il doit être dans un objet instancié, avec new, d’où mon erreur.

Le mot de la fin

Au delà de mon oubli, le strict mode, en plus de réduire la permissivité dans l’écriture du JavaScript, permet d’éviter des erreurs, d’inattention par exemple, et de clarifier pas mal de choses en cherchant le véritable fonctionnement de JavaScript.

Passez de bonnes fêtes, à l’année prochaine !

L'illustration de cet article est une image sous licence CC BY-SA 2.0 par Sayamindu Dasgupta

Cet article vous a été utile ? Partage it !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Si vous le souhaitez, renseignez le champ 'Nom' de cette façon : 'VotreNom@VotreMotClef' pour obtenir une ancre optimisée pour les moteurs de recherche.