Recherche…
ceci avec des objets simples
var person = {
name: 'John Doe',
age: 42,
gender: 'male',
bio: function() {
console.log('My name is ' + this.name);
}
};
person.bio(); // logs "My name is John Doe"
var bio = person.bio;
bio(); // logs "My name is undefined"
Dans le code ci-dessus, person.bio
utilise le contexte ( this
). Lorsque la fonction est appelée person.bio()
, le contexte est transmis automatiquement et il enregistre correctement "Je m'appelle John Doe". Lors de l'attribution de la fonction à une variable, elle perd son contexte.
En mode non strict, le contexte par défaut est l'objet global ( window
). En mode strict, il n'est undefined
.
Sauvegarde pour utilisation dans les fonctions / objets imbriqués
Un écueil commun est d'essayer d'utiliser this
dans une fonction imbriquée ou d' un objet, où le contexte a été perdu.
document.getElementById('myAJAXButton').onclick = function(){
makeAJAXRequest(function(result){
if (result) { // success
this.className = 'success';
}
})
}
Ici, le contexte ( this
) est perdu dans la fonction de rappel interne. Pour corriger cela, vous pouvez enregistrer la valeur de this
dans une variable:
document.getElementById('myAJAXButton').onclick = function(){
var self = this;
makeAJAXRequest(function(result){
if (result) { // success
self.className = 'success';
}
})
}
ES6 a introduit des fonctions fléchées qui incluent this
liaison lexicale. L'exemple ci-dessus pourrait être écrit comme ceci:
document.getElementById('myAJAXButton').onclick = function(){
makeAJAXRequest(result => {
if (result) { // success
this.className = 'success';
}
})
}
Contexte de la fonction de liaison
Chaque fonction a une méthode de bind
, qui créera une fonction encapsulée qui l'appellera avec le contexte correct. Voir ici pour plus d'informations.
var monitor = {
threshold: 5,
check: function(value) {
if (value > this.threshold) {
this.display("Value is too high!");
}
},
display(message) {
alert(message);
}
};
monitor.check(7); // The value of `this` is implied by the method call syntax.
var badCheck = monitor.check;
badCheck(15); // The value of `this` is window object and this.threshold is undefined, so value > this.threshold is false
var check = monitor.check.bind(monitor);
check(15); // This value of `this` was explicitly bound, the function works.
var check8 = monitor.check.bind(monitor, 8);
check8(); // We also bound the argument to `8` here. It can't be re-specified.
Reliure dure
- L'objet de la liaison dure est de "lier" une référence à
this
. - Avantage: utile lorsque vous souhaitez protéger des objets particuliers contre la perte.
- Exemple:
function Person(){
console.log("I'm " + this.name);
}
var person0 = {name: "Stackoverflow"}
var person1 = {name: "John"};
var person2 = {name: "Doe"};
var person3 = {name: "Ala Eddine JEBALI"};
var origin = Person;
Person = function(){
origin.call(person0);
}
Person();
//outputs: I'm Stackoverflow
Person.call(person1);
//outputs: I'm Stackoverflow
Person.apply(person2);
//outputs: I'm Stackoverflow
Person.call(person3);
//outputs: I'm Stackoverflow
- Donc, comme vous pouvez le remarquer dans l'exemple ci-dessus, quel que soit l'objet que vous transmettez à Person , il utilisera toujours l' objet person0 : c'est un objet lié .
cela dans les fonctions constructeur
Lorsque vous utilisez une fonction en tant que constructeur , this
liaison spéciale fait référence au nouvel objet créé:
function Cat(name) {
this.name = name;
this.sound = "Meow";
}
var cat = new Cat("Tom"); // is a Cat object
cat.sound; // Returns "Meow"
var cat2 = Cat("Tom"); // is undefined -- function got executed in global context
window.name; // "Tom"
cat2.name; // error! cannot access property of undefined