Pages

Paramêtres des fonctions


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

Paramètres sur les events