À portée mondiale
ceci ;
Lorsque ceci est utilisé dans la portée globale, il pointe vers l'objet global.
Voici une introduction détaillée aux objets globaux :
Un objet global est un objet qui a été créé avant d'entrer dans un contexte d'exécution
Il n'existe qu'une seule copie de cet objet et ses propriétés sont accessibles n'importe où dans le programme. Le cycle de vie de l'objet global se termine au moment où le programme se termine.
Dans la phase de création initiale de l'objet global, Math, String, Date, parseInt sont initialisés comme ses propres propriétés, et d'autres propriétés peuvent également être créées en tant que propriétés (qui peuvent pointer vers l'objet global lui-même). Par exemple, dans le DOM, la propriété window de l'objet global peut faire référence à l'objet global lui-même.
Donc, taper window dans la console est la même chose que this.window.
Lors de l'appel d'une fonction
foo();
Ici, cela pointe également vers l'objet global.
Lors de l'appel d'une méthode
test.foo();
Dans cet exemple, cela pointera vers l'objet de test.
Lors de l'appel d'un constructeur
nouveau foo();
Lorsqu'une fonction est appelée avec le mot-clé new, nous l'appelons un constructeur. À ce stade, au sein de la fonction, cela pointe vers l'objet nouvellement créé.
Lorsqu'il est explicitement défini
function foo(a, b, c) {}// var bar = {}; foo.apply(bar, [1, 2, 3]); // array will expand to the below foo.call(bar, 1, 2, 3); // results in a = 1, b = 2, c = 3
Lors de l'utilisation des méthodes apply et call de Function.prototype, la valeur de this est explicitement définie comme premier paramètre de la méthode.
Ainsi, contrairement aux règles d’appel d’une fonction, dans l’exemple ci-dessus, cela fait référence à bar.
Voici les modalités d'appel et de candidature :
méthode d'appel :
Syntaxe : call([thisObj[,arg1[, arg2[, [,.argN]]]]])
Définition : Appelez une méthode d'un objet pour remplacer l'objet actuel par un autre objet.
appliquer la méthode :
Syntaxe : apply([thisObj[,argArray]])
Définition : Appliquer une méthode d'un objet pour remplacer l'objet actuel par un autre objet.
Une chose que nous devons noter ici est que lorsqu'un objet est déclaré littéralement, cela ne peut pas être utilisé pour pointer vers l'objet lui-même. Comme suit :
var obj = {me: this}
Ici, cela ne pointera pas vers obj, et son application est limitée aux cinq situations ci-dessus.
Résumé
Bien que la situation ci-dessus ait du sens la plupart du temps, cela dans la deuxième situation (c'est-à-dire lors de l'appel d'une fonction) est en réalité rarement utile et est considéré comme une autre erreur dans la conception Javascript.
Foo.method = function() { function test() { // this is set to the global object } test(); }
D'après ce que nous avons dit ci-dessus, cela pointera ici vers l'objet global, pas vers la fonction Foo.
Afin d'accéder à Foo en test, nous devons créer une variable locale dans la méthode pointant vers Foo.
Foo.method = function() { var that = this; function test() { // Use that instead of this here } test(); }
c'est juste un nom de variable normal, mais il est souvent utilisé pour pointer vers un objet externe.
Il existe un autre point intéressant lié aux alias de fonction, c'est-à-dire lors de l'affectation d'une méthode à une variable.
var test = someObject.methodTest; test();
Dans l'exemple ci-dessus, test sera traité comme une fonction ordinaire, donc selon le deuxième cas (c'est-à-dire lors de l'appel d'une fonction), son interne this pointera vers la variable globale au lieu de someObject.
Bien que cette liaison tardive puisse sembler une mauvaise décision au premier abord, elle constitue en réalité la base du fonctionnement de l’héritage prototypique.
function Foo() {} Foo.prototype.method = function() {}; function Bar() {} Bar.prototype = Foo.prototype; new Bar().method();
À ce stade, lorsque la méthode est appelée, elle pointera vers l'objet instance de Bar.