Est-il possible d'exécuter un bloc de code sans l'implicite with(global)
contexte que tous les scripts semblent avoir par défaut ? Par exemple, dans un navigateur, y aurait-il un moyen de configurer un scripts de sorte qu'une ligne telle que
const foo = location;
jette
Uncaught ReferenceError : l'emplacement n'est pas défini
au lieu d'accéder à window.location
quand location
n'a pas été déclaré en premier ? Si ce n'est pas le cas, existe-t-il un moyen pour qu'une telle référence implicite puisse entraîner un avertissement quelconque ? Cela peut être une source de bogues lors de l'écriture du code (voir ci-dessous), donc avoir un moyen de s'en prémunir pourrait être utile.
(Bien sûr, en raison des règles de scoping ordinaires, il est possible de déclarer une autre variable avec le même nom en utilisant la commande const
ou let
ou dans un bloc interne, pour s'assurer que l'utilisation de ce nom de variable fait référence à la nouvelle variable plutôt qu'à la propriété globale, mais ce n'est pas la même chose).
Cela revient à demander s'il est possible d'arrêter de référencer une propriété à l'intérieur d'un fichier de type réel with
déclaration :
const obj = { prop: 'prop' };
with (obj) {
// how to make referencing "prop" from somewhere within this block throw a ReferenceError
}
Il est connu que with
ne devrait pas être utilisé en premier lieu, mais malheureusement il semble que nous n'ayons pas le choix lorsqu'il s'agit de la with(global)
qui permet parfois de sauver quelques personnages au prix de bugs déroutants qui apparaissent assez fréquemment : 1 2 3 4 5 6 . Par exemple :
var status = false;
if (status) {
console.log('status is actually truthy!');
}
(le problème ici : window.status
est une propriété réservée - lorsqu'elle est assignée, elle transforme l'expression assignée en une chaîne de caractères)
Ce genre de bogues est la même raison pour laquelle l'utilisation explicite de l'option with
est découragé ou interdit, pourtant l'implicite with(global)
continue à poser des problèmes, même en mode strict, et il serait donc utile de trouver un moyen de le contourner.