Ce principe de travail
Si une fonction est appelée méthode d'objet, cela sera attribué à cet objet.
Copier le code du code comme suit:
var parent = {
Méthode: fonction () {
console.log (ceci);
}
};
parent.Method ();
// <-parent
Notez que ce comportement est très "fragile". Cela confond la plupart des développeurs.
Copier le code du code comme suit:
Thisclowncar ();
// <-window
Changer ceci
Les méthodes .Call, .Apply et .Bind ont été utilisées pour faire fonctionner la méthode d'appel des fonctions pour nous aider à définir les valeurs de ceci et les valeurs de paramètre transmises à la fonction.
Function.prototype.Call peut avoir n'importe quel nombre de paramètres.
Copier le code du code comme suit:
Array.prototype.slice.Call ([1, 2, 3], 1, 2)
// <- [2]
Function.prototype.apply est similaire à .Call, mais les paramètres qu'il transmettait à la fonction est un tableau, pas un paramètre.
String.prototype.split.apply ('13 .12.02 ', ['. '])
// <- ['13', '12', '02']
Function.prototype.bind crée une fonction spéciale qui utilisera toujours les paramètres transmis à .bind comme une valeur qui peut être transmise à .bind, et la version curride qui peut allouer une partie des paramètres et créer la fonction d'origine.
Copier le code du code comme suit:
var arr = [1, 2];
var add = array.prototype.push.bind (arr, 3);
// efficacement le même que arr.push (3)
ajouter ();
// efficacement le même que arr.push (3, 4)
ajouter (4);
console.log (arr);
// <- [1, 2, 3, 3, 4]
Ceci dans la chaîne de domaine
Dans l'exemple suivant, cela ne pourra pas rester inchangé dans la chaîne de domaine. Il s'agit du défaut des règles, et il apporte souvent de la confusion aux développeurs amateurs.
Copier le code du code comme suit:
Fonction de scoping () {
console.log (ceci);
Return function () {
console.log (ceci);
};
}
SCOPING () ();
// <-window
// <-window
Il existe une méthode commune pour créer une variable locale pour maintenir une référence à cela, et il ne doit pas y avoir de variables de vie dans le domaine de la subaction. Les variables du même nom dans le sous-soldat couvriront la référence à celle-ci dans le score parent. http://www.cnblogs.com/sosoft/
Copier le code du code comme suit:
fonction de retenue () {
var seelf = this;
Return function () {
console.log (self);
};
}
Conserver () ();
// <-window
À moins que vous ne vouliez vraiment utiliser ceci de la portée des parents en même temps et la valeur actuelle de cette valeur, pour des raisons inexplicables, je préfère utiliser la fonction Méthode .Bind. Ceci peut être utilisé pour spécifier la portée des parents pour désigner le sous-scope.
Copier le code du code comme suit:
fonction up () {) {)
Return function () {
console.log (ceci);
} .Bind (this);
}
casser () ();
// <-window