Un argument passé par valeur est copié, et c'est la copie qui est manipulée par la fonction. Ainsi toute modification de cette copie n'entraîne donc aucun changement dans la donnée d'origine. Ce qui n'est pas le cas pour un passage par référence.
Comment sont passés les arguments en JS ?
les variables ou objets sont toujours passés par valeur
Mais la valeur dépend du type de l'argument.
Pour les types natifs (number, string ....), c'est par valeur et pour les tableaux et autres objets se sera la valeur de la référence.
Passage valeur
let age = 50;function changeAgeNatif(age) {
age++;
}
function changeAgeObject(person) {
person.age++;
}
changeAgeNatif(age);
console.log(age);
Passage référence
function Person(age) {this.age = age;
}
let denis = new Person(50);
function changeAgeObject(person) {
person.age++;
}
changeAgeObject(denis);
console.log(denis.age);
fichier⏩
JS Bin on jsbin.com
Des fonctions peuvent être passées en arguments
exemple :
var values = [0,3,2,1];
console.log(values);
values.sort(function(value1,value2){ return value2 - value1; });
console.log(values);
fichier2⟴
Cas des fonctions en argument : perte du contexte.
function Person(age) {this.age = age;
}
Person.prototype.changeAgeObject = function(){
this.age++;
};
let denis = new Person(50);
denis.changeAgeObject();
console.log(denis.age);
// passage fonction en argument et perte du this
function test(methode) {
methode();
}
test(denis.changeAgeObject);
console.log(denis.age);
En Javascript, quand on passe une méthode en argument, on perd le contexte.
Voici la correction, il faut explicitement lier la fonction au contexte !
test(denis.changeAgeObject.bind(denis));
console.log(denis.age);
On s'accroche voici le code de bind :
Function.prototype.bind = function(obj) {
var method = this;
temp = function() {
return method.apply(obj, arguments);
};
return temp;
};
Comprendre ce code est l'objectif de J. rezig dans son livre Javascript Ninja