2
votes

Convertir des variables privées en variables publiques

J'essaye de découvrir comment envoyer des variables privées à la portée globale. J'ai créé une brève démo:

function test() {
    let private1 = 1, private2 = 2;

    return private1;
}

test(); // returns the first variable value, but not if I have multiple variables
console.log(private1); // returns obvious error - how to make private variable global?

De toute évidence, la journalisation de toutes les variables renverra une erreur car elles n'existent que dans la portée locale par rapport à la fonction de test. Ma question est donc la suivante: comment ces variables peuvent-elles être rendues publiques?

Je n'ai jamais eu à utiliser de variables de cette façon, et je n'ai pas pu trouver d'autres articles expliquant cela, alors est-ce généralement une mauvaise pratique? Je suis curieux de savoir. Toute explication ou indication sur la meilleure façon de traiter les variables serait très utile, merci.


0 commentaires

8 Réponses :


7
votes

Une variable déclarée à l'intérieur d'une fonction n'est disponible qu'à l'intérieur de cette fonction, sauf si vous la déclarez en dehors de la fonction.

Dans cet exemple, vous ne pouvez pas utiliser private1 en dehors de la fonction.

/ p>

let private1;

function test() {
  private1 = 1;
  return private1;
}
test();
console.log(private1);

Vous ne pouvez pas le rendre global autrement en dehors de la portée de ladite fonction.

Dans cet exemple, vous pouvez utiliser private1 en dehors de la fonction.

function test() {
  let private1 = 1;
  return private1;
}
test();
console.log(private1);


0 commentaires

1
votes

Vous pouvez créer des variables globales et leur attribuer une valeur

function test() {
    let private1 = 1, private2 = 2;

    return private1;
}

var result = test(); 
console.log(result);

ou vous pouvez utiliser la valeur renvoyée

let global1,global2;
function test() {
    let private1 = 1, private2 = 2;
    global1 = private1;
    global2 = private2;

    return private1;
}

test(); 
console.log(global1); 


0 commentaires

1
votes

Le moyen le plus simple de rendre private1 global serait de faire quelque chose comme ceci

let global1

function test() {
    let private1 = 1, private2 = 2;

    return private1;
}

global1 = test()

Mais, comme le dit l'autre réponse, si vous le vouliez, il serait préférable de déclarer la variable à l'extérieur la portée de la fonction.


0 commentaires

1
votes

Si vous utilisez un navigateur, vous pouvez les affecter à window.

function test() {
    let private1 = 1, private2 = 2;

    return {
      private1,
      private2
    };
}

console.log(test())

Ou vous pouvez les exporter en les renvoyant:

function test() {
  window.private1 = 1, window.private2 = 2;
}

test()

console.log(private1, private2)

Est-ce donc généralement une mauvaise pratique?

Oui, les rendre globaux est une mauvaise pratique. Cependant, les exporter s'ils sont vraiment nécessaires en dehors de la fonction elle-même est acceptable.


0 commentaires

1
votes

La portée de let est fixe, vous ne pouvez pas y accéder en dehors de la fonction. La solution à votre problème consiste à lier la variable à la fenêtre.

function test() {
    private1 = 1; // or you can use window.private1 = 1
    private2 = 2;
    return private1;
}


test(); 
console.log(private1);

Si vous ne déclarez pas votre variable avec var let ou const , elle est automatiquement liée à la portée de la fenêtre, mais cela n'est pas considéré comme une bonne pratique. Vous pouvez également utiliser window.variableName à cette fin.


0 commentaires

1
votes

Pourquoi d'abord privé puis public? Si vous avez besoin d'un espace privé, vous pouvez prendre un IIFE et une affectation de déstructuration de l'objet résultat à des variables globales.

var { private1: global1, private2: global2 } = function () {
        let private1 = 'foo',
            private2 = 'bar';
            
        return { private1, private2 };
    }();

console.log(global1, global2);


0 commentaires

3
votes

Il existe 2 façons d'ajouter une variable au global (et uniquement à la portée globale) depuis l'intérieur d'une fonction (sans renvoyer les variables dans un objet ou un tableau). Cependant, en ajoutant une variable à la portée globale, vous la rendez disponible pour chaque script exécuté sur cette page.

1. Assurez-vous que le mode strict n'est pas activé et "oubliez" de déclarer les variables

function test() {
    return [1, 2];
}
var { 0: private1, 1: private2 } = test();

Lorsque le mode strict n'est pas utilisé, alors chaque fois que JavaScript voit un variable qui n'a pas été déclarée alors il la déclare automatiquement sur la portée globale. Cependant, c'est une très mauvaise pratique et doit être évitée.

2. Ajoutez les variables directement à l'objet global

function test() {
    return { private1: 1, private2: 2 };
}
var { private1: private1, private2: private2 } = test();

L'objet window peut être obtenu en utilisant window ou this . Mais ceci ne renverra la fenêtre que si elle n'est pas appelée depuis l'intérieur d'un objet ou d'une fonction liée / appliquée.

Retour et destruction (ES6)

Une fonctionnalité intéressante d'ES6 (ce qui signifie que cela ne peut pas être utilisé sur les anciens navigateurs comme IE) est la déstructuration qui vous permet de faire ceci:

function test() {
    window.private1 = 1;
    this.private2 = 2;
    return private1;
}


0 commentaires

1
votes

N'ajoutez simplement aucune déclaration au début. Javascript traite cela comme une variable globale.

window.private1;
window.private2;

Après l'appel de la fonction test le private1 et private2 définis comme une variable globale.

Si vous mettez une console ci-dessous, testez comme ceci

console.log(private1,private2);
//1 2 is the answer.

Il sera imprimé dans le console et vous pouvez également l'appeler ainsi.

function test(){
   private1 = 1;
   private2 = 2
}

test();

C'est tout.


0 commentaires