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:
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
Lorsqu'une référence contient un objet de base, par exemple:
myObj.method();
La method
this
valeur à l'intérieur indiquera myObj
.
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
.