Closure : one more !
Article
Vous pouvez commencer par lire un article général sur les closures : Article sur les closuresCode
Nous pouvons examiner trois exemples de code et le résultat dans le débogueur :http://jsbin.com/xuqika/2/edit?html,js,console,output
function f(){
console.log(C);
}
f();
let C = "c";
A l'appel de la fonction C est inconnue !
{
let U = "je suis oubliée par la closure";
function f(){
console.log(C);
}
let C = "c";
} // bloc
f();
A l'appel de la fonction C est connue. Or le bloc n'est plus accessible (on ne pourrait afficher U en dehors). Cela semble magique ...
La "closure" est intelligente (elle ne garde vraiment que les variables utiles)
http://jsbin.com/xuqika/3/edit?html,js,console
Historiquement, avant l'arrivée des blocs, nous pouvions générer une closure de la façon suivante :
function A() {
let a = " a ";
function B() {
console.log (a);
}
return B;
}
let closure = A();
closure();
Le fermeture (closure) est constituée de la fonction B et de son environnement. Ainsi, l'exécution de la fonction closure permet d'atteindre la variable a.
Le comportement est surprenant car :
When you declare a variable in a function, you can access this variable only within the function. You can't get this variable once you get out of it.
Voici la vue du débogger.
map
const liste = [
{age:10,arg:2,exp:2},
{age:1,arg:1},
{age:100,arg:3},
];
function AgeArg({arg,age}){
return age*arg;
}
let T = liste.map(AgeArg);
console.log(T);
{age:10,arg:2,exp:2},
{age:1,arg:1},
{age:100,arg:3},
];
function AgeArg({arg,age}){
return age*arg;
}
let T = liste.map(AgeArg);
console.log(T);
reduce : destructuring
const liste = [
{age:10,arg:2,exp:2},
{age:1,arg:1},
{age:100,arg:3},
];
function AgeArg(acc,{arg,age}){
return acc+ age*arg;
}
let T = liste.reduce(AgeArg,0);
console.log(T); //321
{age:10,arg:2,exp:2},
{age:1,arg:1},
{age:100,arg:3},
];
function AgeArg(acc,{arg,age}){
return acc+ age*arg;
}
let T = liste.reduce(AgeArg,0);
console.log(T); //321
for_of
const liste = [
{age:10,arg:2,exp:2},
{age:1,arg:1},
{age:100,arg:3},
];
console.log(l.age)
}
console.log(arg*age)
}
{age:10,arg:2,exp:2},
{age:1,arg:1},
{age:100,arg:3},
];
for_of
classique
for (l of liste){console.log(l.age)
}
destructuring
for ({arg,age} of liste){console.log(arg*age)
}
foreach array of objet
const liste = [
{age:10,arg:2,exp:2},
{age:1,arg:1},
{age:100,arg:3},
];
console.log(v.arg)
})
console.log(v.arg)
})
console.log(arg*age)
})
{age:10,arg:2,exp:2},
{age:1,arg:1},
{age:100,arg:3},
];
forEach
classique
liste.forEach(function(v,i){console.log(v.arg)
})
arrow
liste.forEach((v,i)=>{console.log(v.arg)
})
destructuring
liste.forEach(({age,arg},i)=>{console.log(arg*age)
})
array Random
Array.from({length: Math.random()*9}, (v, k) => k);
Ne pas utiliser V = value qui n'est pas définie
Ne pas utiliser V = value qui n'est pas définie
Inscription à :
Articles (Atom)


