À quoi se réfère-t-il

Quel est le ceci (dans les fonctions intérieures) qui se réfère dans le contexte de code suivant? Est-ce que cela indique le TimeSpan?

var TimeSpan = function (days, hours, minutes, seconds, milliseconds) { var attrs = "days hours minutes seconds milliseconds".split(/\s+/); var gFn = function (attr) { return function () { return this[attr]; }; }; var sFn = function (attr) { return function (val) { this[attr] = val; return this; }; }; } 

Merci

this valeur est définie implicitement en fonction de la façon dont la fonction est invoquée , il y a trois cas où cela se produit:

  1. Lorsqu'une référence sans objet de base ou une non-référence est invoquée:

     myFn(); // the myFn reference has no base object (function () {})(); // non-reference 

    this valeur indiquera l'objet global 1

  2. Lorsqu'une référence contient un objet de base, par exemple:

     myObj.method(); 

    La method this valeur à l'intérieur indiquera myObj .

  3. Lorsque le new opérateur est utilisé:

     var obj = new Foo(); 

    this valeur dans la fonction Foo , indiquera un objet nouvellement créé qui hérite de Foo.prototype .

this valeur peut également être définie explicitement , en utilisant l' call et apply méthodes, par exemple, avec un call :

 function test(a) { return alert(this + a); } test.call("hello", " world"); // alerts "hello world" 

Ou avec apply si nous devons "appliquer" un ensemble d'arguments d'un tableau à une fonction:

 function test(a, b) { return alert(this + a + b); } var args = ["my ", "world "]; test.apply("hello ", args); // alerts "hello my world" 

[1] Cela a changé sur le nouveau mode Strict strict ECMAScript , maintenant qu'une référence de fonction sans objet de base ou une non-référence est invoquée (comme premier cas), this valeur contiendra undefined .

Cela a été fait parce que lorsque vous travaillez avec des fonctions de constructeur, les gens oublient souvent d'utiliser le new opérateur lorsque vous appelez le constructeur.

Lorsque cela s'est produit, la valeur de this valeur a pointé vers l'objet global, et qui a fini par ajouter des propriétés globales indésirables.

Maintenant, en mode strict, this contiendra indéfini, et si la recherche de propriété est faite sur ce ( this.foo = 'foo' ), nous aurons une belle exception TypeError , au lieu d'avoir une propriété foo globale.

this réfère à l'objet actuel, dans ce cas, la fonction dans laquelle vous vous trouvez. Puisque tout en JavaScript est un objet, vous pouvez modifier les attributs d'un objet fonction à l'aide du mot this clé this :

 var f = function() { this.key = "someValue"; } console.log(f.key); // prints "someValue" 

Donc, dans ce cas, this devrait indiquer la fonction au niveau de portée le plus profond, et non TimeSpan .