J'essaie de m'attribuer une variable dans une fonction, et si la variable a le même nom qu'un argument de la fonction, cela ne semble pas fonctionner, mais si ce n'est pas le même nom. Un exemple de code le montre plus clairement.

Est-ce ce comportement auquel je dois m'attendre? Ceci est un exemple simplifié pour mon cas d'utilisation d3 qui a suscité cette question. Je l'ai également montré ci-dessous.

Exemple non fonctionnel

var a;

function assign(a) {
    a = a;
}
assign("test")
console.log(a)

indéfinie

Exemple de travail

var a;

function assign(b) {
    a = b;
}
assign("test")
console.log(a)

tester

Cas d'utilisation

var data
d3.csv("data.csv", function(error, data) {
    //Doesn't work for me
    data = data
}
console.log(data)

indéfinie

2
canyon289 15 juil. 2015 à 06:49

3 réponses

Meilleure réponse

Dans votre premier exemple, l'argument a transmis à la fonction ombres la variable a qui est défini à l'extérieur, donc: a=a est l'affectation de l'argument (qui a été passé à la fonction) à lui-même.

5
Tali 15 juil. 2015 à 03:52

Vous pouvez utiliser l'objet window pour accéder à la variable globale.

var a;

function assign(a) {
    window.a = a; // specifying the scope.
};
assign("test")
console.log(a)

Plus d'informations sur les 15-common-javascript-gotchas

0
sachin.ph 15 juil. 2015 à 04:05

En Javascript, la portée est une portée de niveau fonctionnel, donc chaque fois que la variable est référencée, elle est recherchée pour sa déclaration dans la portée contenant (fonction), si elle la trouve, elle l'utilise, sinon elle continue à chercher dans la chaîne prototypique jusqu'à la portée globale. Donc dans votre cas, il essaie de rechercher a et il le trouve comme argument a donc il arrête la recherche là-bas et utilise a à partir de l'argument.

Donc, pour éviter le conflit, vous devez utiliser deux méthodes.

  1. Utilisez les différents noms
  2. Si vous souhaitez utiliser le même nom, utilisez la résolution de portée explicite.

Ex.

var a;

function assign(a) {
   Global.a = a //Global is placeholder here for outerscope that variable a is coming from.
}
assign("test")
console.log(a);

Liens utiles pour une compréhension plus claire

1
Community 23 mai 2017 à 12:21